Microsoft/TypeScript

wrong behavior about type parameters of `as` clause in a mapped type

Open

#59.713 geöffnet am 22. Aug. 2024

Auf GitHub ansehen
 (2 Kommentare) (0 Reaktionen) (0 zugewiesene Personen)TypeScript (6.726 Forks)batch import
Domain: Mapped TypesHelp WantedPossible Improvement

Repository-Metriken

Stars
 (48.455 Stars)
PR-Merge-Metriken
 (Durchschn. Merge 6T 17h) (9 gemergte PRs in 30 T)

Beschreibung

🔎 Search Terms

type parameter as mapped type

🕗 Version & Regression Information

5.7.0-dev.20240821

⏯ Playground Link

https://www.typescriptlang.org/play/?ts=5.7.0-dev.20240821#code/C4TwDgpgBAkgzgZWAJwJYDsDmAeAKgPigF4pcBtAXSggA9gJ0ATOKOFDTSqAfihQFdoALigAzAIYAbOBABQoSFADyAW1TAkaLAGkIIPNToNmUAPYAjAFYQAxsEIkA3rKiuoZbVAxQA1ntOipFDiLPCaHHgeFIS09EwsAtC86BAAbhDIItoUIuTZsgC+srKi-Oh2qKboYnj4ABTAuQCUIo5QjOLA4rlQBVDObnzg0ACCxLCI7Fi1UAD0s+0QohnIEIwubgrQAELjY7HGCciCPHzHwmJSMnMLjEsraxuuW1AAwuNhUziOHV25BWQAOS-cSA6I3RbLZCrdaDVbAfjIaqOPohZRqDRfXT6NognoFQjzKAAAxBxK8LFMGPo6yKQA

💻 Code

type IsString<T> = T[] extends string[] ? true : false
type OmitStringKey<T extends object> = {
    [K in keyof T as IsString<T[K]> extends true ? never: K]: T[K]
}

function f<T>(t: T): { data: T } {
    type A = IsString<T> // deferred
    type B = A extends true ? true : false // deferred
    type C = IsString<{data: T}['data']> // deferred
    return {} as OmitStringKey<{ data: T }> // `data` is omitted
}

🙁 Actual behavior

OmitStringKey<{ data: T }> omit data property. That means IsString<T> extends true in the as clause is true, while T is not decided yet.

🙂 Expected behavior

type evaluation should be deferred

Additional information about the issue

No response

Contributor Guide