问题 #
实现内置的 Exclude <T,U>
类型,但不能直接使用它本身。
从联合类型T中排除U的类型成员,来构造一个新的类型。
解答 #
type MyExclude<T, U> = T extends U ? never : T
拆分 #
- 注意是联合类型,从联合类型
T
中排除U
的类型成员,来构造一个新的类型 T extends U
如果T
是U
的子集则返回never
,否则返回T
- 联合类型会自动分发类型
type T = Exclude<1 | 2, 1 | 3> // -> 2
- 4自动分发后的类型等于 (1 extends 1 | 3 ? never : 1) | (2 extends 1 | 3 ? never : 2)