在js中,在获取普通对象键值的时候会隐性的调用toString方法,转变成string,这是不友好的
因此ts中对象的键名只能是string和number,因为这两个调用toString是可以很直观的进行转化的
使用
其实之前已经使用过索引签名了
interface user{[propName:string]:string;}
这规定了user接口类型的对象的键值对是string:string这样的(实际1:’2’这样的也可以,因为js的自动转换)
在设置了索引签名后,其他的属性值就必须和索引签名的相同,下面这样是不被允许的
interface user{age:number;//报错action:{walk:'true'},//正确[propName:string]:{walk:'true'};}
最佳实践 索引签名的嵌套
在使用索引签名的时候,不推荐将可选属性和索引签名放在一起使用,这会使类型检查失效,即使是错误的拼写也会因为索引签名通过检查
interface User {name: string;age?: number;[propName: string]: string | number;}let user1 = {name: "jack",agw: 18//通过,被认为是索引签名};
最好的做法是将索引签名放在嵌套的可选属性下
interface User {name: string;age?: number;action?: {[propName: string]: string | number;};}let user1: User = {name: "jack",agw: 18//报错};
这样,错误的拼写就无法通过类型检查了
另外,这种嵌套的写法也可以让我们规避索引签名的限制,即被索引签名的指定类型给束缚住
