Time Bomb Veela
  1. 1 Time Bomb Veela
  2. 2 Warcry mpi
  3. 3 Flower Of Life 发热巫女
  4. 4 One Last You Jen Bird
  5. 5 Life Will Change Lyn
  6. 6 Last Surprise Lyn
  7. 7 The Night We Stood Lyn
  8. 8 Quiet Storm Lyn
  9. 9 Hypocrite Nush
  10. 10 Libertus Chen-U
  11. 11 かかってこいよ NakamuraEmi
2018-11-18 01:56:44

Typescript内置工具泛型整理

在Typescript的开发中,除了针对具体业务数据定义一些泛型外,大多数情况下也会封装一些通用的泛型以供更具体的类型定义中复用,这一类泛型定义我称之为工具泛型。实际上Typescript中已经原生提供了一系列好用的工具泛型,就在这里做一个整理。

Partial

将传入的类型T所有属性转化为可选类型。基于关键字keyofin实现。

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中排除nullundefined类型。

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」 标签。