关键词: TypeScript, TypeChallenge
实现内置的Exclude类
例如
type T0 = MyExclude<"a" | "b" | "c", "a">; // expected "b" | "c"
type T1 = MyExclude<string | number | boolean, string | Function>; // expected number | booleantype MyExclude<T, E> = T extends E ? never : T;当使用条件类型时, TS 会进行"分配" 的操作, 举例:
// 不使用条件, 不分配
type NotActuallyToArray<Type> = Type[];
// 使用条件, 分配, `Type extends any`恒为true, 这里只是为了开启分配的功能
type ToArray<Type> = Type extends any ? Type[] : never;
type StrArr_Or_NumArr = ToArray<string | number>; // string[] | number[]
type StrOrNum_Arr = NotActuallyToArray<string | number>; // (string | number)[]所以, 这里我们使用 T 的时候其实得到的不是传入的那个union类型, 而是其中的每一项.
对于原本类型中的每一项, 如果E(待排除的union)中包含它则舍弃, 否则保留
type MyExclude<T, E> = T extends E ? never : T;伪码如下
function MyExclude(T, E) {
const returnType = never
for(let t of T) {
if(t is subset of E) continue
else returnType |= t
}
return returnType
}