Skip to content

索引签名类型

绝大多数情况下,我们都可以在使用对象前就确定对象的结构,并为对象添加准确的类型。
使用场景∶当无法确定对象中有哪些属性(或者说对象中可以出现任意多个属性),此时,就用到索引签名类型了。

typescript
interface AnyObject {
    [key: string]: number
}

let obj: AnyObject = {
    a: 1,
    b: 2,
    c: 3
}

解释:

  • 使用 [key: string] 来约束该接口中允许出现的属性名称。表示只要是 string 类型的属性名称,都可以出现在对象中。
  • 这样,对象obj中就可以出现任意多个属性(比如,ab 等)。
  • key只是一个占位符,可以换成任意合法的变量名称。
  • 隐藏的前置知识:js中对象的键是 string 类型的。

在JS中数组是一类特殊的对象,特殊在数组的键(索引)是数值类型。
并且,数组也可以出现任意多个元素。
所以,在数组对应的泛型接口中,也用到了索引签名类型。

typescript
interface MyArray<T> {
    [n: number]: T
}

const array: MyArray<number> = [1, 2, 3]
  • MyArray 接口模拟原生的数组接口,并使用 [n: number] 来作为索引签名类型。
  • 该索引签名类型表示:只要是 number 类型的键(索引)都可以出现在数组中,或者说数组中可以有任意多个元素。
  • 同时也符合数组索引是 number 类型这一前提。

请勿转载