Microsoft/TypeScript

Inconsistent behaviour of `-?`

Open

#59,948 创建于 2024年9月12日

在 GitHub 查看
 (8 评论) (0 反应) (0 负责人)TypeScript (6,726 fork)batch import
BugDomain: Mapped TypesHelp Wanted

仓库指标

Star
 (48,455 star)
PR 合并指标
 (平均合并 6天 17小时) (30 天内合并 9 个 PR)

描述

🔎 Search Terms

optional mapped type

🕗 Version & Regression Information

  • This changed between versions 5.4.5 and 5.5.4

⏯ Playground Link

https://www.typescriptlang.org/play/?exactOptionalPropertyTypes=true#code/C4TwDgpgBA8mwEsD2A7AhgGwCpIKouRQHUFgALfAEwgDMEUJKAeLAPigF4oBvAKCgFQA2gGko9KAGsIIJDShYAugC4FUCAA9gEFJQDOUAEoQAxkgBOzEQBoFoxa36DnAfjsjFT5wNVZ7UAB8oAFddWnpGXgBfXl5QSCgASRRtcwBbBEoENG1OWHhCTBx8QhJyKnCGZm4oNBdVPWBzegBzKCj2AHpOnlr6qEbmlDag0Oo6Kva48GgAGVIIc0w8mrqGptbAkLCJxnaoboG0NOh46DQDZNSMrJyIWLOjCD0ARjzjAEdghHNGJivFjdstouj1Vushm0Yo9jHoAEzvCBfH5-eapTCg3poCGbUY7CKUdpAA

💻 Code

type OptionalToUnionWithUndefined<T> = {
    [K in keyof T]: T extends Record<K, T[K]>
        ? T[K]
        : T[K] | undefined
}

type Intermediate = OptionalToUnionWithUndefined<{ a?: string }> // { a?: string | undefined }
type Literal = { a?: string | undefined } // same type as Intermediate

type Res1 = Required<Intermediate> // { a: string }
type Res2 = Required<Literal> // { a: string | undefined }

🙁 Actual behavior

Res1 and Res2 are different types

🙂 Expected behavior

they should be the same because the inputs are

Additional information about the issue

This issue may share the cause with #59902

贡献者指南