TypeScript 的映射类型(Mapped Types)是一种强大的类型系统特性,允许你基于现有类型创建新的类型。映射类型使用类似于数组和对象解构的语法,但用于类型级别的操作。通过映射类型,你可以在类型系统中进行各种变换和操作,如将某些属性设为可选、只读,或改变其类型。
基本语法
映射类型的基本语法如下:
type MappedType = {
[P in K]: T;
};
K
:表示一个键的联合类型。P in K
:表示遍历联合类型K
中的每个键P
。T
:表示每个键P
对应的值的类型。
常见的映射类型示例
1. 基本映射类型
type Stringify<T> = {
[P in keyof T]: string;
};
- 作用:将对象类型
T
中所有属性的类型都变为string
。
interface Person {
name: string;
age: number;
}
type StringifiedPerson = Stringify<Person>;
// StringifiedPerson 的类型为 { name: string; age: string; }
2. 可选属性
type Partial<T> = {
[P in keyof T]?: T[P];
};
- 作用:将对象类型
T
中所有属性变为可选属性。
interface Person {
name: string;
age: number;
}
type PartialPerson = Partial<Person>;
// PartialPerson 的类型为 { name?: string; age?: number; }
3. 只读属性
type Readonly<T> = {
[P in keyof T]: Readonly<T[P]>;
};
- 作用:将对象类型
T
中所有属性变为只读属性。
interface Person {
name: string;
age: number;
}
type ReadonlyPerson = Readonly<Person>;
// ReadonlyPerson 的类型为 { readonly name: string; readonly age: number; }
4. 移除只读属性
type Mutable<T> = {
-readonly [P in keyof T]: T[P];
};
- 作用:将对象类型
T
中所有只读属性变为可变属性。
interface ReadonlyPerson {
readonly name: string;
readonly age: number;
}
type MutablePerson = Mutable<ReadonlyPerson>;
// MutablePerson 的类型为 { name: string; age: number; }
5. 移除可选属性
type Required<T> = {
[P in keyof T]-?: T[P];
};
- 作用:将对象类型
T
中所有可选属性变为必选属性。
interface PartialPerson {
name?: string;
age?: number;
}
type RequiredPerson = Required<PartialPerson>;
// RequiredPerson 的类型为 { name: string; age: number; }
高级映射类型
1. 条件类型与映射类型结合
type Nullable<T> = {
[P in keyof T]: T[P] | null;
};
- 作用:将对象类型
T
中所有属性的类型变为原类型或null
。
interface Person {
name: string;
age: number;
}
type NullablePerson = Nullable<Person>;
// NullablePerson 的类型为 { name: string | null; age: number | null; }
2. 过滤属性类型
type NonFunctionProperties<T> = {
[P in keyof T]: T[P] extends Function ? never : P;
}[keyof T];
- 作用:提取对象类型
T
中所有非函数类型的属性键。
interface Mixed {
name: string;
age: number;
greet: () => void;
}
type NonFunctionKeys = NonFunctionProperties<Mixed>;
// NonFunctionKeys 的类型为 "name" | "age"
总结
映射类型是 TypeScript 类型系统中非常有用的工具,允许你在类型级别进行各种复杂的变换和操作。通过理解和掌握映射类型,你可以更灵活地定义和操作类型,从而编写出更健壮和类型安全的代码。