Microsoft/TypeScript

Inconsistent behaviour of `-?`

Open

#59,948 opened on 2024幎9月12日

GitHub で芋る
 (8 comments) (0 reactions) (0 assignees)TypeScript (6,726 forks)batch import
BugDomain: Mapped TypesHelp Wanted

Repository metrics

Stars
 (48,455 stars)
PR merge metrics
 (平均マヌゞ 6d 17h) (30d で 9 merged PRs)

説明

🔎 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

コントリビュヌタヌガむド