在TypeScript中,索引签名(Index Signatures)和映射类型(Mapped Types)是两种强大的特性,它们帮助开发者更精确地描述对象结构和创建复杂的类型定义。
索引签名(Index Signatures)
索引签名允许你为对象的属性指定一个类型,这样你就可以使用字符串或数字作为索引来访问这些属性。这在处理具有不确定数量或动态属性名的对象时非常有用,比如字典、哈希表或者某些API返回的数据结构。
例子:
interface StringArray {
[index: number]: string; // 索引签名定义
}
const myArray: StringArray = ['a', 'b', 'c'];
console.log(myArray[1]); // 输出 'b'
在这个例子中,StringArray
接口使用了一个索引签名,它声明了任何数字类型的键都将映射到一个字符串类型的值。因此,你可以使用数字索引来安全地访问数组元素。
映射类型(Mapped Types)
映射类型是一种根据现有类型创建新类型的方法,它通过遍历原始类型的属性并应用某种转换来生成新的类型定义。这使得你可以基于现有类型定义出一系列相关的类型,而无需重复编写相似的代码。
例子:
type Readonly<T> = {
readonly [P in keyof T]: T[P];
};
interface Person {
name: string;
age: number;
}
type ReadonlyPerson = Readonly<Person>;
const person: ReadonlyPerson = { name: 'Alice', age: 30 };
// 试图修改person的属性会引发编译错误,因为它们都是只读的
person.name = 'Bob'; // Error: Cannot assign to 'name' because it is a read-only property.
在这个例子中,我们定义了一个名为Readonly
的映射类型,它接受一个类型T
作为参数,并生成一个新的类型,其中T
的所有属性都变成了只读的。通过使用keyof T
和映射语法[P in keyof T]
,我们能够遍历Person
接口的所有属性,并将它们转换为只读属性,从而创建了ReadonlyPerson
类型。
总结来说,索引签名用于为对象的动态属性指定类型,而映射类型则是一种高级的类型操作,可以基于现有类型自动生成新的类型定义,非常适合于类型系统中的模式匹配和转换。