Skip to content

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

@geoffreytools

Description

@geoffreytools

πŸ”Ž 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions