《TypeScript实战指南》—3.1.3 可索引类型

举报
华章计算机 发表于 2019/06/16 13:13:32 2019/06/16
【摘要】 本节书摘来自华章计算机《TypeScript实战指南》一书中的第3章,第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],因为索引签名是只读的。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。