Microsoft/TypeScript

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

オープン

#59,713 opened on 2024/08/22

 (2 件のコメント) (0 件のリアクション) (0 人の担当者)TypeScript (13,395 件のフォーク)batch import
Domain: Mapped TypesHelp WantedPossible Improvement

Repository metrics

Stars
 (108,860 個のスター)
PR merge metrics
 (PR metrics pending)

説明

🔎 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

コントリビューターガイド