microsoft / microsoft/TypeScript
Incorrect inference of mapped substitution type in conditional involving a union of arrays (regression)
Nobody has claimed this yet.
- Dominant language
- Go
- Stars
- 111k
- Forks
- 14.3k
- Avg merge
- 1d 19h
- Merged PRs (30d)
- 117
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
💻 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.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with the linked TypeScript Playground reproduction and compare behavior between versions 5.0.4 and 5.1.6. Investigate conditional and mapped-type inference for the union of arrays, then verify that the supplied Foo, A, and B examples compile with the expected results without needing Extract.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- typescript
- Domain
- compilers
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Clearly specified
- Newbie friendliness
- 25/100