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 ?
TypeScript Version: 4.1.2
Search Terms: conditional type true branch generic narrowing
Code
Expected behavior: in
CommandDatawe are narrowing the generic parameterUusing a conditional type, so in the true branch of the conditionalCshould 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
CommandDataconditionals, C does not satisfy the constraint of eitherNumCommandDataorChrCommandDataPlayground Link: playground
Related Issues: maybe #24085 ?