索引签名类型
绝大多数情况下,我们都可以在使用对象前就确定对象的结构,并为对象添加准确的类型。
使用场景∶当无法确定对象中有哪些属性(或者说对象中可以出现任意多个属性),此时,就用到索引签名类型了。
typescript
interface AnyObject {
[key: string]: number
}
let obj: AnyObject = {
a: 1,
b: 2,
c: 3
}
解释:
- 使用
[key: string]
来约束该接口中允许出现的属性名称。表示只要是string
类型的属性名称,都可以出现在对象中。 - 这样,对象obj中就可以出现任意多个属性(比如,
a
、b
等)。 - key只是一个占位符,可以换成任意合法的变量名称。
- 隐藏的前置知识:js中对象的键是
string
类型的。
在JS中数组是一类特殊的对象,特殊在数组的键(索引)是数值类型。
并且,数组也可以出现任意多个元素。
所以,在数组对应的泛型接口中,也用到了索引签名类型。
typescript
interface MyArray<T> {
[n: number]: T
}
const array: MyArray<number> = [1, 2, 3]
MyArray
接口模拟原生的数组接口,并使用[n: number]
来作为索引签名类型。- 该索引签名类型表示:只要是
number
类型的键(索引)都可以出现在数组中,或者说数组中可以有任意多个元素。 - 同时也符合数组索引是
number
类型这一前提。