映射类型(Mapped Types)是 TypeScript 中一种强大的类型工具,它允许你基于现有类型创建新的类型。映射类型通过使用关键字 keyof
和类型属性来创建新的类型,同时可以修改这些属性的类型或可选性等。这对于创建类型之间的转换非常有用。
映射类型的基本语法
映射类型的定义通常包含以下元素:
- 关键字
type
或interface
:用于定义新类型。 - 类型参数:通常用
T
表示,它是映射的基础类型。 { [P in K]: ... }
形式的属性:这里K
是类型T
的键的集合,P
是这些键中的每一个。- 属性签名:可以改变原始属性的类型、可选性等。
示例:实现只读属性的转换
假设我们有一个对象类型 Person
,我们想要创建一个新的类型 ReadOnlyPerson
,其中所有的属性都是只读的。我们可以使用映射类型来实现这一目标。
步骤 1: 定义基础类型
首先,我们需要定义一个 Person
类型,它包含一些属性:
type Person = {
name: string;
age: number;
location: string;
};
步骤 2: 创建映射类型
接下来,我们使用映射类型来创建 ReadOnlyPerson
类型。在这个映射类型中,我们将遍历 Person
类型的所有属性,并将它们标记为只读。
type ReadOnly<T> = {
readonly [P in keyof T]: T[P];
};
这里的 ReadOnly<T>
类型接收一个类型参数 T
。对于 T
类型中的每一个属性 P
,我们在新类型中定义一个只读属性 readonly [P in keyof T]: T[P];
。这意味着新类型将包含与原类型相同的属性,但是这些属性都是只读的。
步骤 3: 应用映射类型
现在我们可以使用这个映射类型来创建 ReadOnlyPerson
类型了:
type ReadOnlyPerson = ReadOnly<Person>;
步骤 4: 测试类型
让我们创建一个 Person
类型的实例,并将其转换为 ReadOnlyPerson
类型,然后尝试修改它的属性以验证是否成功实现了只读:
const person: Person = {
name: 'Alice',
age: 30,
location: 'New York'
};
const readOnlyPerson: ReadOnlyPerson = person;
// 尝试修改只读属性,应该报错
readOnlyPerson.name = 'Bob'; // 编译错误: Cannot assign to 'name' because it is a read-only property.
在这个例子中,我们定义了一个 Person
类型,并使用映射类型 ReadOnly<T>
来创建了一个 ReadOnlyPerson
类型。当尝试修改 readOnlyPerson
的属性时,TypeScript 报告了一个编译错误,表明属性是只读的。
总结
通过使用映射类型,我们可以轻松地基于现有的类型创建新的类型,并且能够对属性进行转换。在本例中,我们通过将属性标记为只读来创建了一个只读版本的对象类型。这种方法同样可以应用于其他场景,例如改变属性的可选性、添加或移除特定属性等。