为什么TypeScript对象不能用泛型类型索引?

时间:2017-03-13 21:04:56

标签: javascript generics typescript

在JavaScript中,普通的旧对象可以进行各种滥用。例如,你可以写:

var obj = {};
var func = new Function() {};
obj[func] = 5; // totally fine
obj[func]; // returns 5

通过一些创造力,您可以编写一个通用类SimpleSet<T>,它可以使用对象作为JavaScript或TypeScript中的后备存储。一种直截了当的方式可能涉及写这样的东西:

public add(val: T) {
  this._dict[val] = val;
}

哪些在TypeScript中不起作用。 为什么? add的更多许可版本有效,请参阅add2add3

class SimpleSet<T> {
  _dict: Object;
  constructor() {

  }

  // error:
  public add(val: T) {
    this._dict[val] = val;
  }

  // no error:    
  public add2(val: T) {
    this._dict[val as any] = val;
  }

  // no error:
  public add3(val: any) {
    this._dict[val] = val;
  }
}

使用add,会出现两个错误:

  

类型'T'不能分配给'Object [T]'。

     

类型'T'不能用于索引类型'Object'。

enter image description here

为什么吗

1 个答案:

答案 0 :(得分:4)

TypeScript不允许你,因为它不起作用,这是一个相当不错的理由。

JavaScript对象的索引键是始终始终string s。通过其他类型的事物索引强制字符串的键,然后查找。例如,正如注释中所指出的,对象索引会生成键"[object Object]"

您可以将ES6 Map对象用于工作对象到值的存储。