TypeScript的类型映射(Mapped Types)是一种强大的特性,允许你基于现有类型创建新的类型。类型映射通常用于对类型进行批量操作,比如将所有属性设为可选、只读,或者将属性类型进行转换。
以下是一些常见的类型映射示例:
1. 基本类型映射
假设你有一个接口Person
:
interface Person {
name: string;
age: number;
address: string;
}
你可以使用类型映射来创建一个所有属性都变为可选的类型:
type PartialPerson = {
[P in keyof Person]?: Person[P];
};
PartialPerson
类型等同于:
interface PartialPerson {
name?: string;
age?: number;
address?: string;
}
2. 使用内置的类型映射工具
TypeScript提供了一些内置的类型映射工具,比如Partial
、Readonly
、Pick
和Record
。
Partial<T>
:将类型T
的所有属性变为可选。type PartialPerson = Partial<Person>;
Readonly<T>
:将类型T
的所有属性变为只读。type ReadonlyPerson = Readonly<Person>;
Pick<T, K>
:从类型T
中选择一组属性K
,构成新的类型。type NameAndAge = Pick<Person, 'name' | 'age'>;
Record<K, T>
:构造一个类型,其属性名为K
,属性值类型为T
。type StringRecord = Record<'name' | 'age' | 'address', string>;
3. 高级类型映射
你还可以使用条件类型和类型映射来创建更复杂的类型。例如,将所有属性类型转换为字符串:
type Stringify<T> = {
[P in keyof T]: string;
};
type StringifiedPerson = Stringify<Person>;
StringifiedPerson类型等同于:
interface StringifiedPerson {
name: string;
age: string;
address: string;
}
4. 条件类型映射
你可以结合条件类型来进行更复杂的映射。例如,将所有属性类型为string
的属性变为可选:
type OptionalStringProperties<T> = {
[P in keyof T]: T[P] extends string ? T[P] | undefined : T[P];
};
type OptionalStringPerson = OptionalStringProperties<Person>;
OptionalStringPerson
类型等同于:
interface OptionalStringPerson {
name?: string;
age: number;
address?: string;
}
总结
类型映射是TypeScript中非常强大的特性,允许你基于现有类型进行批量操作和转换。通过类型映射,你可以创建更灵活和可重用的类型定义,从而提高代码的可维护性和可读性。