《TypeScript实战指南》—3.1.3 可索引类型
3.1.3 可索引类型
与使用接口描述函数类型差不多,我们也可以描述那些能够“通过索引得到”的类型,例如a[10]或ageMap["daniel"]。可索引类型具有一个“索引签名”,描述了对象索引的类型,还有相应的索引返回值类型。让我们看如下例子:
interface StringArray {
[index: number]: string;
}
let myArray: StringArray;
myArray = ["Bob", "Fred"];
let myStr: string = myArray[0];
其中,我们定义了StringArray接口,它具有索引签名。这个索引签名表示了当用number去索引StringArray时会得到string类型的返回值。
共有两种索引类型:字符串和数字。可以同时使用这两种类型的索引,但是数字索引的返回值必须是字符串索引返回值类型的子类型,这是因为当使用number来索引时,JavaScript会将它转换成string然后再去索引对象。也就是说,用100(一个number)去索引等同于使用"100"(一个string)去索引,因此两者需要保持一致:
class Animal {
name: string;
}
class Dog extends Animal {
breed: string;
}
// 错误:使用数值型的字符串索引,有时会得到完全不同的Animal!
interface NotOkay {
[x: number]: Animal;
[x: string]: Dog;
}
字符串索引签名能够很好地描述dictionary模式,并且也会确保所有属性与其返回值类型相匹配。因为字符串索引声明了obj.property和obj["property"]两种形式都可以。下面的例子里,name的类型与字符串索引类型不匹配,所以类型检查器给出一个错误提示:
interface NumberDictionary {
[index: string]: number;
length: number; // 可以,length是number类型
name: string // 错误,`name`的类型与索引类型返回值的类型不匹配
}
最后,可以将索引签名设置为只读,这样就防止了给索引赋值:
interface ReadonlyStringArray {
readonly [index: number]: string;
}
let myArray: ReadonlyStringArray = ["Alice", "Bob"];
myArray[2] = "Mallory"; // error!
在这里不能设置myArray[2],因为索引签名是只读的。
- 点赞
- 收藏
- 关注作者
评论(0)