microsoft / microsoft/TypeScript
Constraints of nested conditional types applied to constrained type variables are incorrect
Nobody has claimed this yet.
- Dominant language
- Go
- Stars
- 111k
- Forks
- 14.4k
- Avg merge
- 1d 19h
- Merged PRs (30d)
- 117
Description
🔎 Search Terms
constraints conditional types type variables nested
🕗 Version & Regression Information
- This is the behavior in every version I tried
⏯ Playground Link
💻 Code
type IsMatchingStringOneLevel<T extends string> = T extends `a${string}`
? true
: false;
function f2<S extends string>(x: IsMatchingStringOneLevel<S>) {
let t: true = x; // Error
let f: false = x; // Error
}
type IsMatchingStringTwoLevels<T extends string> = T extends `a${string}`
? T extends `${string}z`
? true
: false
: false;
function f3<S extends string>(x: IsMatchingStringTwoLevels<S>) {
let t: true = x; // Error
let f: false = x; // Ok but should be an error
}
🙁 Actual behavior
It doesn't error on the fourth assignment
🙂 Expected behavior
It should error
Additional information about the issue
This is just a variant of what was fixed for one-level conditionals in https://github.com/microsoft/TypeScript/pull/56004
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 its one-level conditional behavior with the approach described in pull request 56004. Trace how the nested conditional type in the example is evaluated for constrained type variables, then verify that the fourth assignment produces an error while preserving the reported behavior for the other assignments.
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
- Mostly clear
- Newbie friendliness
- 42/100