Jacleklm's Blog

TypeScript中的内置工具类型及其实现

2020/12/09

先来看下基础实现 clone,把 T 里面的都拷贝一次:

1
2
3
type cloneT<T> = {
[K in keyof T]: T[K];
};

Partial

用法

将类型定义的所有属性都修改为可选

1
2
3
4
5
6
7
8
9
10
type Foo = {
name: string;
age: number;
}
type Coord = Partial<Foo>
// 等同于
type Coord = {
name?: string;
age?: number;
}

实现

1
2
3
type Partial<T> = {
[K in keyof T]?: T[K];
};

类似Partial的实现,还有 Required,Readonly

Required 的作用是将传入的属性变为必选项, Readonly是将所有属性定义为自读,源码如下

1
2
3
4
5
6
type Required<T> = { 
[K in keyof T]-?: T[K];
};
type Readonly<T> = {
readonly [K in keyof T]: T[K];
};

类似 -?, readonly, 同理还有 -readonly

Record

用法

以 typeof 格式快速创建一个类型,此类型包含一组指定的属性且都是必填

1
2
3
4
5
6
7
type Coord = Record<'x' | 'y', number>;

// 等同于
type Coord = {
x: number;
y: number;
}

实现

Readonly

不管是从字面意思,还是定义上都很好理解:将所有属性定义为自读

1
2
3
4
5
6
7
8
9
10
11
type Coord = Readonly<Record<'x' | 'y', number>>;

// 等同于
type Coord = {
readonly x: number;
readonly x: number;
}

// 如果进行了修改,则会报错:
const c: Coord = { x: 1, y: 1 };
c.x = 2; // Error: Cannot assign to 'x' because it is a read-only property.

Pick

从类型定义的属性中,选取指定一组属性,返回一个新的类型定义。

1
2
3
4
5
6
7
type Coord = Record<'x' | 'y', number>;
type CoordX = Pick<Coord, 'x'>;

// 等用于
type CoordX = {
x: number;
}

一个很实用的实现就是 clone,把 T 里面的都拷贝一次

1
2
3
type cloneT<T> = {
[K in keyof T]: T[K];
};

重要的就是这个in操作符,你完全可以把它理解为就是for…in,也就包含了遍历的过程

Partial

clone再可选

1
2
3
type Partial<T> = {
[K in keyof T]?: T[K];
};

参考文献

CATALOG
  1. 1. Partial
    1. 1.1. 用法
    2. 1.2. 实现
  2. 2. 类似Partial的实现,还有 Required,Readonly
  3. 3. Record
    1. 3.1. 用法
    2. 3.2. 实现
  4. 4. Readonly
  5. 5. Pick
  6. 6. Partial