抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

先来看下基础实现 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];
};

参考文献

评论