类型映射(Mapped Types)是 TypeScript 中的一种强大的工具,允许开发者通过遍历已有类型的每个属性并创建新的类型。它主要使用映射类型语法,结合索引类型和 keyof 操作符,能够轻松地生成新的类型,使得代码更加灵活和可维护。
以下是一个简单的例子,演示了如何使用类型映射创建一个只读版本的接口:
interface Person {
name: string;
age: number;
}
type ReadonlyPerson = {
readonly [K in keyof Person]: Person[K];
};
const person: ReadonlyPerson = {
name: "John",
age: 30,
};
// 以下操作会导致编译错误
// person.name = "Alice";
// person.age = 25;
在这个例子中,通过使用 { readonly [K in keyof Person]: Person[K] }
的语法,我们创建了一个新的类型 ReadonlyPerson
,它具有与 Person
相同的属性,但所有属性都是只读的。这种方式避免了在每个属性上手动添加 readonly
修饰符的重复工作。
基本的映射类型语法
下面是一些常见的映射类型语法和用法:
只读属性映射类型
type Readonly<T> = {
readonly [K in keyof T]: T[K];
};
可选属性映射类型
type Partial<T> = {
[K in keyof T]?: T[K];
};
移除属性映射类型
type Omit<T, K extends keyof T> = {
[P in Exclude<keyof T, K>]: T[P];
};
选取属性映射类型
type Pick<T, K extends keyof T> = {
[P in K]: T[P];
};
高级映射类型
除了基本的映射类型语法外,还可以结合条件类型和其他高级类型来创建更复杂的映射类型。
type NullableProperties<T> = {
[K in keyof T]: null extends T[K] ? K : never;
};
type NullableKeys<T> = NullableProperties<T>[keyof T];
在这个例子中,NullableKeys<T>
返回了类型 T
中所有值为 null
的属性的键的联合类型。