microsoft / microsoft/TypeScript

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

Open
#56,018 1 comment 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Bug Domain: Conditional Types Help Wanted
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

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.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.