Skip to content

Generic type param not narrowed in true branch of conditional type #42077

Open
@pedro-pedrosa

Description

@pedro-pedrosa

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

Needs InvestigationThis issue needs a team member to investigate its status.RescheduledThis issue was previously scheduled to an earlier milestone

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions