Microsoft/TypeScript

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

Open

#59,713 建立於 2024年8月22日

在 GitHub 查看
 (2 留言) (0 反應) (0 負責人)TypeScript (6,726 fork)batch import
Domain: Mapped TypesHelp WantedPossible Improvement

倉庫指標

Star
 (48,455 star)
PR 合併指標
 (平均合併 6天 17小時) (30 天內合併 9 個 PR)

描述

🔎 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

貢獻者指南