TypeScript 字面量联合类型

3

我有两种文字类型,我想从联合A中排除B。

type A = 'a' | 'b'
type B = 'a'

当我这样做:

type MyExclude<A2, B2> = A2 extends B2 ? never : A2
type C2 = MyExclude<A, B>
// C2 = 'b'

它能正常工作,即我得到了“b”。

但是当我直接这样做时:

type C = A extends B ? never : A
// C = 'a' | 'b'

没有必要。我通过中间的通用类型还是直接操作,这有什么关系呢?

谢谢。


你可以直接从 TypeScript 中使用 Exclude - Oleksii
1个回答

1
当您将其作为通用类型使用时,TypeScript 将对联合的每个成员应用检查。因此,type C2 = MyExclude<A, B> 不会被评估为 'a | b' extends 'a' ? never : 'a | 'b',而是 ('a' extends 'a' ? never : 'a') | ('b' extends 'a' ? never : 'b')。'a' 确实扩展了 B,因此结果为 never。'b' 没有扩展 B,因此结果为 'b'。最终结果是 never | 'b',即 'b'
如果它不是通用类型,则不会发生分配部分。 type C = A extends B ? never : A 只会被评估一次,即 'a | b' extends 'a' ? never : 'a | 'b''a' | 'b' 不扩展 'a',因此结果是整个类型,'a' | 'b'
请参阅分配条件类型

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接