挑战

实现内置的Exclude<T, U>。从T中排除U指定的类型。例如:

type T0 = Exclude<"a" | "b" | "c", "a">; // expected "b" | "c"
type T1 = Exclude<"a" | "b" | "c", "a" | "b">; // expected "c"

解答

这里重要的细节是 TypeScript 中的条件类型 是可分配的

所以当你在写T extends UT是联合类型时,实际上发生的是 TypeScript 遍历联合类 型T并将条件应用到每个元素上。

因此,这个解答是非常直接的。我们检查T如果可以分配给U则跳过:

type MyExclude<T, U> = T extends U ? never : T;

参考