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中非常强大的特性,允许你基于现有类型进行批量操作和转换。通过类型映射,你可以创建更灵活和可重用的类型定义,从而提高代码的可维护性和可读性。