Typescript内置工具泛型整理
在Typescript的开发中,除了针对具体业务数据定义一些泛型外,大多数情况下也会封装一些通用的泛型以供更具体的类型定义中复用,这一类泛型定义我称之为工具泛型。实际上Typescript中已经原生提供了一系列好用的工具泛型,就在这里做一个整理。
Partial
将传入的类型T所有属性转化为可选类型。基于关键字keyof
和in
实现。
type Partial<T> = {
[P in keyof T]?: T[P]
};
Readonly
将传入的类型T所有属性转化为只读属性,实现和Partial
相同。
type Readonly<T> = {
readonly [P in keyof T]: T[P]
};
Required
将传入的类型T所有属性转化为必选项,实现和Partial
相同。这里需要注意一个语法-?
,也很好理解,就是将可选项的?
去掉变为必选项。
type Required<T> = {
[P in keyof T]-?: T[P];
};
Pick
从类型T中挑选出部分子属性K来构造类型,基于extend
实现。
type Pick<T, K extends keyof T> = {
[P in K]: T[P];
};
Record
将类型K中所有属性转化为T类型,基于extend
实现。
type Record<K extends keyof any, T> = {
[P in K]: T;
};
Exclude
TS2.8引入了一种新的条件类型写法如下:
T extends U ? X : Y
// 如果T是U的子类型,返回X,否则返回Y
基于该特性有了此工具泛型的实现,作用是从T中排除可以赋值给U的类型。
type Exclude<T, U> = T extends U ? never : T;
Extract
同样基于条件类型,作用是从T中挑选出可以赋值给U的类型。
type Extract<T, U> = T extends U ? T : never;
NonNullable
同样基于条件类型,作用是从T中排除null
和undefined
类型。
type NonNullable<T> = T extends null | undefined ? never : T;
ReturnType
该工具泛型实现基于infer
关键字,这个关键字的作用是在条件类型中推断类型来代替手动获取类型。
该工具泛型的作用是获取函数类型T的返回值类型。
type ReturnType<T extends (...args: any[]) => any> = T extends (...args: any[]) => infer R ? R : any;
InstanceType
同样是基于infer关键字实现,作用是基于构造函数类型T的实例类型构造一个新类型。
type InstanceType<T extends new (...args: any[]) => any> = T extends new (...args: any[]) => infer R ? R : any;
小结
以上就是Typescript内置的常用工具泛型,都可以在lib.d.ts
文件中找到,主要也是一个抛砖引玉的作用,可以看到基于常规TS语法和已实现的工具泛型,可以自定义出各式各样的适配于项目的通用泛型来提高类型可读性以及类型定义的效率。
-- EOF --
添加在分类「
前端开发
」下,并被添加
「TypeScript」
标签。