Skip to content

索引签名

索引签名(Index Signatures)

  • 索引签名是一种定义对象类型的方式,它允许使用数字或字符串或symbol作为索引来访问对象的属性。

总结

只要记住一句话,批量描述 key 的一种方式

字符串索引签名:

字符串索引签名可以定义一个对象,该对象可以接受任何字符串作为属性名,并且每个属性都有一个特定的类型。

js
interface T {
    [propName: string]: number
}
let obj: T = {
    "name": 100,
    "age": "200"  // 不能将类型“string”分配给类型“number”
}

提示

上述例子中propName是索引签名的名称,只是为了可读性,其他没有任何意义,可以改写成任意名称。后面的两个类型分别表示 属性键的类型对应值的类型

数字索引签名:

数字索引签名可以定义一个对象,该对象可以接受任何数字作为索引,并且每个索引处的值都有一个特定的类型。

js
interface T {
    [index: number]: string
}
let arr: T = ["1", "2", 3] // 第三项:不能将类型“number”分配给类型“string”
let obj: T = {
    0: '0', // ok
    a: '1' // 对象字面量只能指定已知属性,并且“a”不在类型“T”中
}

注意事项

  • 所有成员都必须符合字符串的索引签名

当你声明一个索引签名时,所有明确的成员都必须符合索引签名

js
const symbol = Symbol("key");
interface A {
    [y: string]: string;
}
let a: A = {
    x: "1", // ok
    symbol: "1",  // ok
    1: "1",  // ok
};
interface B {
    [x: number]: string;
}
let b: B = {
    x: '1', //  对象字面量只能指定已知属性,并且“x”不在类型“B”中
    symbol: '1',  //  对象字面量只能指定已知属性,并且“symbol ”不在类型“B”中
    1: "1",  // ok
};
js
interface T {
    name: string; // Ok
    age?: number; // 类型“number | undefined”的属性“age”不能赋给“string”索引类型“string”
    sex?: undefined; // OK
    [propName: string]: string | undefined;
}

同时拥有 string 和 number 类型的索引签名 (不常用)

js
interface Animal {
    name: string;
}
interface Dog extends Animal {
    breed: string;
}

interface T1 {
    [a: string]: Dog;
    [b: number]: Animal; // Error
}

interface T2 {
    [a: string]: Animal;
    [b: number]: Dog; // OK
}

提示

可以同时使用两种类型的索引,但 数字索引的返回值 必须是 字符串索引返回值 类型的 子类型。 因为当使用 number 来索引时,JavaScript 会将它转换成 string 然后再去索引对象

Released under the MIT License.