Typescript中如何实现Exclude<T, E>?

155 阅读1分钟

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";
})();

如上例子所示,ABCD 是从 Foo 类型中排除相关类型创建的新类型。

Exclude 类型在需要从一个联合类型中排除某些类型时非常有用。它可以帮助你快速创建一个新的类型,包含了原始类型中除了某些类型之外的所有类型。

此外,Exclude 还可以与其他工具类型结合使用,比如 Pick 和 Omit,进行更复杂的类型操作。