返回
类型vs.接口:索引签名的微观世界
前端
2024-01-28 19:58:00
interface 与 type 定义的异同
在TypeScript中,interface和type都是用于定义类型的工具,但它们在某些方面存在着差异。最显著的区别之一就是索引签名。
// interface 索引签名
interface Person {
[key: string]: string;
}
// type 索引签名
type Person = {
[key: string]: string;
};
从上面的代码可以看出,interface和type都可以定义索引签名,但它们在赋值时却有不同的行为。
// interface 索引签名赋值
let person: Person = {
name: 'John',
age: 30,
// 新增属性
address: '123 Main Street'
};
// type 索引签名赋值
let person: Person = {
name: 'John',
age: 30,
// 新增属性 (编译错误)
address: '123 Main Street'
};
在interface中,你可以通过索引签名添加新的属性,而type则不允许这样做。这是因为interface是"开放"的,允许在定义后添加新的属性,而type是"封闭"的,一旦定义就不能再修改。
索引签名的使用场景
索引签名在TypeScript中非常有用,它可以让你定义具有动态属性的对象。例如,你可以定义一个接口来表示一个具有任意数量的字符串属性的对象:
interface Person {
[key: string]: string;
}
然后,你可以使用这个接口来声明一个变量,并给它赋值:
let person: Person = {
name: 'John',
age: '30',
city: 'New York'
};
索引签名也可以用于定义数组类型。例如,你可以定义一个接口来表示一个字符串数组:
interface StringArray {
[index: number]: string;
}
然后,你可以使用这个接口来声明一个变量,并给它赋值:
let colors: StringArray = ['red', 'green', 'blue'];
总结
索引签名是TypeScript中一个非常强大的工具,它可以让你定义具有动态属性的对象和数组。然而,在使用索引签名时,你需要注意interface和type之间的差异。interface是"开放"的,允许在定义后添加新的属性,而type是"封闭"的,一旦定义就不能再修改。