TypeScript 中的
Exclude<T, E>也是一个工具类型(Utility Type)。它用于从类型T中排除E中的所有类型,并创建一个新的类型。
1. 定义
type Exclude<T, E> = T extends E ? never : T;
实现原理:
- 使用条件类型(Conditional Type)的语法进行类型运算。
- 对于每个
T中的类型,如果它是E中的类型,则映射为never(空类型)。 - 如果
T中的类型不是E中的类型,则保留该类型。
这样就创建了一个新的类型,它包含了 T 中除了 E 中的类型之外的所有类型。
2. 示例
(() => {
type Foo = "a" | "b" | "c";
type MyExclude<T, E> = Exclude<T, E>;
type A = MyExclude<Foo, "a">; // 'b' | 'c'
type B = MyExclude<Foo, "c">; // 'a' | 'b
type C = MyExclude<Foo, "c" | "d">; // 'a' | 'b'
type D = MyExclude<Foo, "a" | "b">; // never
const a: A = "b";
const b: B = "b";
const c: C = "a";
const d: D = "c";
})();
如上例子所示,A、B、C、D 是从 Foo 类型中排除相关类型创建的新类型。
Exclude 类型在需要从一个联合类型中排除某些类型时非常有用。它可以帮助你快速创建一个新的类型,包含了原始类型中除了某些类型之外的所有类型。
此外,Exclude 还可以与其他工具类型结合使用,比如 Pick 和 Omit,进行更复杂的类型操作。