在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
的更多许可版本有效,请参阅add2
和add3
。
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'。
答案 0 :(得分:4)
TypeScript不允许你,因为它不起作用,这是一个相当不错的理由。
JavaScript对象的索引键是始终(始终)string
s。通过其他类型的事物索引强制字符串的键,然后查找。例如,正如注释中所指出的,对象索引会生成键"[object Object]"
您可以将ES6 Map
对象用于工作对象到值的存储。