Partial、Pick、Record、Readonly

大约 1 分钟

Partial、Pick、Record、Readonly

这几个是 ts 中内置的高级类型

Partial

将传入的类型中的所有属性都设置为可选。

Partial源码定义如下:

/**
 * Make all properties in T optional
 * 将传入的类型 T 中的所有属性都设置为可选
 */
type Partial<T> = {
    [P in keyof T]?: T[P];
};

示例如下:

type Person = {
	name: string
	age: number
}

type p = Partial<Person>

const person: p = {} // 没有属性,但是不会报错

image-20230311181627632

Pick

传入两个类型,第二个类型应是第一个类型的属性的子集。

Pick的源码定义如下:

/**
 * From T, pick a set of properties whose keys are in the union K
 * 从类型定义 T 的属性中,选取指定一组属性,返回一个新的类型定义。
 */
type Pick<T, K extends keyof T> = {
    [P in K]: T[P];
};

示例如下:

type Person = {
	name: string
	age: number
}

type Name = "name"

type p = Pick<Person, Name>

const person: p = {
	name: "zhangsan",
}

image-20230311182352406

Record

限定传入的第一个参数的类型只能是第二个参数类型。

Record源码定义如下:

/**
 * Construct a type with a set of properties K of type T
 * 构建一个类型,它包含的属性为 K,K 的类型只能是 T
 */
type Record<K extends keyof any, T> = {
    [P in K]: T;
};

示例如下:

type Name = "name" | "gender"

type p = Record<Name, string>

const person: p = {
	name: "zhangsan",
	gender: "male",
}

Readonly

Partial类似,只不过Partial是将所有属性改为而可选,但是Readonly是将所有属性改为readonly

Readonly源码定义如下:

/**
 * Make all properties in T readonly
 * 将所有属性变为 readonly
 */
type Readonly<T> = {
    readonly [P in keyof T]: T[P];
};

示例如下:

type Person = {
	name: string
	age: number
}

type p = Readonly<Person>

const person: p = {
	name: "zhangsan",
	age: 18,
}

image-20230311183804704

上次编辑于: