返回
TypeScript类型体操工具——utility-types(工具类型)
前端
2024-01-25 02:39:59
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 可以帮助我们轻松解决这些问题。