Microsoft/TypeScript

Generic type sometimes returns never instead of actual template parameter type

Open

#41,778 创建于 2020年12月2日

在 GitHub 查看
 (6 评论) (5 反应) (0 负责人)TypeScript (48,455 star) (6,726 fork)batch import
BugDomain: Conditional TypesExperimentation NeededHelp Wanted

描述

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

贡献者指南

Generic type sometimes returns never instead of actual template parameter type · Microsoft/TypeScript#41778 | Good First Issue