microsoft / microsoft/TypeScript
Generic type param not narrowed in true branch of conditional type
@ahejlsberg is already working on this.
Since Dec 23, 2020.
- Dominant language
- Go
- Stars
- 111k
- Forks
- 14.3k
- Avg merge
- 2d 4h
- Merged PRs (30d)
- 132
Description
TypeScript Version: 4.1.2
Search Terms: conditional type true branch generic narrowing
Code
type Num = 0 | 1 | 2
type Chr = 'a' | 'b' | 'c'
type Unit = Num | Chr
type NumCommand = 'add' | 'invert'
type ChrCommand = 'concat' | 'toLower'
type Command<U extends Unit> =
U extends Num ? NumCommand :
U extends Chr ? ChrCommand :
never
type NumCommandData<C extends NumCommand> =
C extends 'add' ? { otherNum: Num } :
never
type ChrCommandData<C extends ChrCommand> =
C extends 'concat' ? { otherChr: Chr } :
never
type CommandData<U extends Unit, C extends Command<U>> =
U extends Num ? NumCommandData<C> :
U extends Chr ? ChrCommandData<C> :
never
Expected behavior: in CommandData we are narrowing the generic parameter U using a conditional type, so in the true branch of the conditional C should also be "narrowed" (not sure if that's the correct term in this case) to the specific command type that depends on U.
Actual behavior: the compiler says that in the true branches of CommandData conditionals, C does not satisfy the constraint of either NumCommandData or ChrCommandData
Playground Link: playground
Related Issues: maybe #24085 ?
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.
Assessment
This issue has not been assessed yet.