在js中,在获取普通对象键值的时候会隐性的调用toString方法,转变成string,这是不友好的
因此ts中对象的键名只能是string和number,因为这两个调用toString是可以很直观的进行转化的

使用

其实之前已经使用过索引签名了

  1. interface user{
  2. [propName:string]:string;
  3. }

这规定了user接口类型的对象的键值对是string:string这样的(实际1:’2’这样的也可以,因为js的自动转换)

在设置了索引签名后,其他的属性值就必须和索引签名的相同,下面这样是不被允许的

  1. interface user{
  2. age:number;//报错
  3. action:{walk:'true'},//正确
  4. [propName:string]:{walk:'true'};
  5. }

最佳实践 索引签名的嵌套

在使用索引签名的时候,不推荐将可选属性和索引签名放在一起使用,这会使类型检查失效,即使是错误的拼写也会因为索引签名通过检查

  1. interface User {
  2. name: string;
  3. age?: number;
  4. [propName: string]: string | number;
  5. }
  6. let user1 = {
  7. name: "jack",
  8. agw: 18//通过,被认为是索引签名
  9. };

最好的做法是将索引签名放在嵌套的可选属性下

  1. interface User {
  2. name: string;
  3. age?: number;
  4. action?: {
  5. [propName: string]: string | number;
  6. };
  7. }
  8. let user1: User = {
  9. name: "jack",
  10. agw: 18//报错
  11. };

这样,错误的拼写就无法通过类型检查了

另外,这种嵌套的写法也可以让我们规避索引签名的限制,即被索引签名的指定类型给束缚住