跳到主要内容

映射类型

TypeScript 中的映射类型是一种强大的工具,它允许你基于一个已有的类型创建一个新类型。映射类型是通过在已有类型的每个属性上应用一个变换来创建新类型的。主要的映射类型有 PartialReadonlyRecordPickOmit 等,同时 TypeScript 还引入了模板字符串和条件类型等概念来进一步扩展映射类型的功能。

下面让我们详细了解几个常见的映射类型:

1. Partial<Type> 类型

Partial<Type> 可以将一个类型的所有属性设置为可选。它的定义如下:

type Partial<T> = {
[P in keyof T]?: T[P];
};

示例

interface Person {
name: string;
age: number;
}

type PartialPerson = Partial<Person>;

const partialPerson: PartialPerson = {}; // 合法,所有属性都是可选的

2. Readonly<Type> 类型

Readonly<Type> 可以将一个类型的所有属性设置为只读。它的定义如下:

type Readonly<T> = {
readonly [P in keyof T]: T[P];
};

示例

interface Person {
name: string;
age: number;
}

type ReadonlyPerson = Readonly<Person>;

const readonlyPerson: ReadonlyPerson = { name: "John", age: 30 };
// readonlyPerson.age = 31; // 错误,属性 'age' 只读

3. Record<Keys, Type> 类型

Record<Keys, Type> 可以创建一个类型,其中属性的键来自于 Keys,属性的值都是 Type。它的定义如下:

type Record<Keys extends keyof any, Type> = {
[P in Keys]: Type;
};

示例

type PersonProps = "name" | "age" | "address";

type PersonRecord = Record<PersonProps, string>;

const personRecord: PersonRecord = {
name: "John",
age: "30", // 合法,属性值类型是 string
// email: "john@example.com" // 错误,属性 'email' 不在 'PersonProps' 中
};

4. Pick<Type, Keys>Omit<Type, Keys> 类型

Pick<Type, Keys>Type 中选择指定的属性,而 Omit<Type, Keys>Type 中剔除指定的属性。它们的定义如下:

type Pick<T, K extends keyof T> = {
[P in K]: T[P];
};

type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>;

示例

interface Person {
name: string;
age: number;
address: string;
}

type PersonNameAndAddress = Pick<Person, "name" | "address">;
// 等价于 type PersonNameAndAddress = { name: string, address: string };

type PersonWithoutAge = Omit<Person, "age">;
// 等价于 type PersonWithoutAge = { name: string, address: string };

这些是 TypeScript 中一些常见的映射类型,通过它们,你可以更灵活地处理和操作类型。需要注意的是,映射类型是在编译时进行的,不会在运行时引入新的对象。