Microsoft/TypeScript

Generic type sometimes returns never instead of actual template parameter type

Open

#41.778 geöffnet am 2. Dez. 2020

Auf GitHub ansehen
 (6 Kommentare) (5 Reaktionen) (0 zugewiesene Personen)TypeScript (6.726 Forks)batch import
BugDomain: Conditional TypesExperimentation NeededHelp Wanted

Repository-Metriken

Stars
 (48.455 Stars)
PR-Merge-Metriken
 (Durchschn. Merge 6T 17h) (9 gemergte PRs in 30 T)

Beschreibung

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 ]
>
```

Contributor Guide