我的代码中有一些地方看起来像这样:
var array = [];
MyClass myObject = new MyClass();
array[myObject] = "something";
基本上我在对象中使用对象作为键。我没有多想它,因为它感觉很自然,代码编译得很好,而且我没有遇到任何错误。
今天我对代码中一个不相关的部分进行了代码推送,Travis抱怨道:
error TS2342: An index expression argument must be of type 'string', 'number', or 'any'.
在array[myObject] = "something";
我认为这是由于tsc
的最新更新。无论如何,它引起了我的注意,现在我不确定我一直在做什么是正确的:
答案 0 :(得分:6)
基本上我在对象中使用对象作为键。
糟糕的主意。 JavaScript不支持将对象作为键。它在对象上调用toString
以在索引之前获取字符串表示。
修复:使用makeString
功能。结帐:https://github.com/basarat/typescript-collections#a-sample-on-dictionary示例
答案 1 :(得分:3)
JavaScript中对象的所有键(所有键)都是字符串。当转换为字符串时,JavaScript中对象的默认行为是生成“[object Object]”。我有点惊讶你还没有碰到这个错误,因为使用对象作为键完全破坏了:
class MyClass { }
var array = [];
var myObject1 = new MyClass();
var myObject2 = new MyClass();
array[myObject1] = "something";
array[myObject2] = "something else";
// Prints "[object Object]"
console.log(Object.keys(array).join(','));
// Prints "something else", not "something"
console.log(array[myObject1]);
答案 2 :(得分:0)
由于接受的答案中给出的原因,使用类实例作为对象键并不是很好。但是,如果 DO 需要使其正常工作,那么就是这样做的。
class MyClass { }
var array = [];
const myObject = new MyClass();
array[<string> myObject] = "something";
注意我在myObject之前如何定义<string>
。它并没有改变Typescript编译的方式(见下文),但确实改变了Typescript解释它的方式。
var MyClass = (function () {
function MyClass() {
}
return MyClass;
}());
var array = [];
var myObject = new MyClass();
array[myObject] = "something";