返回

TypeScript类型体操工具——utility-types(工具类型)

前端

TypeScript类型体操工具——utility-types(工具类型)

最近一段时间比较忙,好久没有写博客了,正好这段时间跟 TypeScript “杠上”了,刚好又看到一个 github 上的仓库 utility-types,写了很多有意思的类型工具,不过这个仓库代码比较难懂,我来尝试讲讲。

utility-types 是什么?

utility-types(工具类型)是TypeScript中一种特殊的类型,它可以帮助我们解决一些类型体操的问题。这些问题通常很难解决,例如:

  • 如何将一个类型的属性转换为另一种类型?
  • 如何将一个类型的属性转换为一个数组?
  • 如何将一个类型的属性转换为一个枚举?

utility-types 可以帮助我们轻松解决这些问题。例如,我们可以使用 Pick<T, K> 工具类型来将一个类型的属性转换为另一种类型:

interface Person {
  name: string;
  age: number;
  gender: string;
}

type PersonName = Pick<Person, "name">;

// PersonName 的类型为:
// {
//   name: string;
// }

utility-types 有哪些?

TypeScript 中有很多内置的 utility-types,例如:

  • Pick<T, K>:将一个类型的属性转换为另一种类型。
  • Omit<T, K>:从一个类型中删除某些属性。
  • Exclude<T, U>:从一个类型中排除另一个类型。
  • Intersect<T, U>:将两个类型合并为一个新的类型。
  • Union<T, U>:将两个类型合并为一个新的类型。

除了这些内置的 utility-types,我们还可以创建自己的 utility-types。例如,我们可以创建一个 Map<T, U> 工具类型来将一个类型的属性转换为另一个类型的属性:

type Map<T, U> = {
  [P in keyof T]: U;
};

interface Person {
  name: string;
  age: number;
  gender: string;
}

type PersonMap = Map<Person, string>;

// PersonMap 的类型为:
// {
//   name: string;
//   age: string;
//   gender: string;
// }

utility-types 的使用场景

utility-types 在 TypeScript 中有很多使用场景,例如:

  • 类型转换: 我们可以使用 utility-types 将一个类型的属性转换为另一种类型。例如,我们可以使用 Pick<T, K> 工具类型来将一个类型的属性转换为另一种类型。
  • 类型删除: 我们可以使用 utility-types 从一个类型中删除某些属性。例如,我们可以使用 Omit<T, K> 工具类型来从一个类型中删除某些属性。
  • 类型合并: 我们可以使用 utility-types 将两个类型合并为一个新的类型。例如,我们可以使用 Intersect<T, U> 工具类型来将两个类型合并为一个新的类型。
  • 类型扩展: 我们可以使用 utility-types 将一个类型的属性扩展为另一个类型的属性。例如,我们可以使用 Map<T, U> 工具类型来将一个类型的属性扩展为另一个类型的属性。

总结

utility-types 是TypeScript中一种特殊的类型,它可以帮助我们解决一些类型体操的问题。这些问题通常很难解决,utility-types 可以帮助我们轻松解决这些问题。