้•œๅƒ็ซ™็‚น ยท ๆœฌ้กต็”ฑ็ฌฌไธ‰ๆ–น GitHub ๅช่ฏป้•œๅƒๆไพ›๏ผŒ้ž GitHub ๅฎ˜ๆ–น็ซ™็‚น๏ผŒไธๆŽฅๅ—ไปปไฝ•็™ปๅฝ•ๆˆ–ๅ‡ญๆฎ่พ“ๅ…ฅใ€‚ๅ‰ๅพ€ github.com
Skip to content

Incorrect inference of mapped substitution type in conditional involving a union of arrays (regression)ย #56018

Description

๐Ÿ”Ž Search Terms

"inference", "conditional type", "substitution type", "mapped type", "type constraint", "array", "union type"

๐Ÿ•— Version & Regression Information

This changed between versions 5.0.4 and 5.1.6

โฏ Playground Link

https://www.typescriptlang.org/play?ts=5.1.6#code/C4TwDgpgBAShB2BDAthAJlAvFAThRaA9vADYhQAUA3lANoDWAXFAAo6GQ6gDSEIAuswDOwHAEt4AcygBfKAB8oAV3hoIAMwnoAlLX4AofaEhQAYoUIAeACpQIAD2AI0Q3PiKlyFNhwhcQvOSKKmqa8Dp6CrAIKOgAfFj6UMlQtg5Oqq5wSKgYAPxQAOIQwIFClnAAjkpieGg2cQnMVTV1DYbG0MWlfOUwdo7OWTG5Cdg0tNxQElD0fITqsIKz84swk-yyhgD028pCiJIQRuDQAIJYZhaWtADkiLd5-Am7dABEiG8GnVAAQpfmKy0GiIPLMW4AI1usmeUFetA+XyAA

๐Ÿ’ป Code

type Renamed = readonly ({ [k: PropertyKey]: string } | undefined)[]

type Foo<T extends readonly (PropertyKey | undefined)[] | Renamed> =
    T extends Renamed ? GetKeys<Required<T>> : Required<T>
//                              ~~~~~~~~~~
// Type 'Required<T>' does not satisfy the constraint 'Renamed'

type GetKeys<R extends Renamed> = { [K in keyof R]: keyof R[K] }

// usage
type A = Foo<['a'?]> // ["a"]
type B = Foo<[{ a?: 'b' }]> // ["a"]

๐Ÿ™ Actual behavior

TS fails to see that Required<T extends Renamed> extends Renamed.

๐Ÿ™‚ Expected behavior

It should compile.

Additional information about the issue

Substitute readonly (PropertyKey | undefined)[] with something that is not an array and the problem disappears.

I get the same error when I do GetKeys<Id<T>> with type Id<T> = { [K in keyof T]: T[K] }.

Extract<Required<T>, Required<Renamed>> silences the error, but Extract<Required<T>, Renamed> does not.

Activity

  1. Andarist commented on Oct 7, 2023

    @Andarist
    Contributor

    I bisected it to this diff and to this PR. To be more precise - the adjustment from this PR to getResolvedApparentTypeOfMappedType broke this.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions