Open
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 ?
Metadata
Metadata
Assignees
Labels
Type
Projects
Milestone
Relationships
Development
No branches or pull requests
Activity
RyanCavanaugh commentedon Dec 23, 2020
Currently narrowing doesn't apply to constraints; I'm not sure how feasible that would be.
Simpler example
agentcooper commentedon Dec 24, 2020
It seems that this example illustrates the same point. It was unclear to me why
test2
is behaving differently until I saw Ryan's reply above.I need a generic there to eventually write a conditional return type based on the function parameter.
n9 commentedon Feb 4, 2021
Is this a similar case?
Playground
Or it fails for a different reason?
pedro-pedrosa commentedon May 27, 2021
this is still giving my example an error after 4.3.0-beta, but agentcooper's example compiles now. I'm guessing it's because he's using a type guard where I'm using a conditional type.
14 remaining items