Microsoft/TypeScript

Generic type sometimes returns never instead of actual template parameter type

Open

#41.778 aberto em 2 de dez. de 2020

Ver no GitHub
 (6 comments) (5 reactions) (0 assignees)TypeScript (6.726 forks)batch import
BugDomain: Conditional TypesExperimentation NeededHelp Wanted

Métricas do repositório

Stars
 (48.455 stars)
Métricas de merge de PR
 (Mesclagem média 6d 17h) (9 fundiu PRs em 30d)

Description

TypeScript Version: 3.6+

Search Terms: enum, extends, never, template parameters

Code

enum FL4 { Absurd, False, True, Unknown }

type Classify< Left, Right > = Left extends Right

	? Right extends Left
		? [ Left , '==', Right ]
		: [ Left , '<:', Right ]
	
	: Right extends Left
		? [ Left, ':>', Right ]
		: [ Left , '!=', Right ]

Actual at 3.6+

type Absurd_is_never_wtf = Assert<
    Classify< FL4.Absurd, 0 >,
    [ never, '<:', 0 ]
>

type One_is_never_wtf = Assert<
    Classify< FL4.Absurd, 1 >,
    [ FL4.Absurd, ':>', never ]
>

Expected and before 3.6

type Absurd_is_Absurd = Assert<
    Classify< FL4.Absurd, 0 >,
    [ FL4.Absurd, '==', 0 ]
>

type One_is_One = Assert<
    Classify< FL4.Absurd, 1 >,
    [ FL4.Absurd, ':>', 1 ]
>
```

Guia do colaborador