错误TS2342:索引表达式参数必须是'string','number'或'any'类型

时间:2014-10-09 02:56:30

标签: typescript

我的代码中有一些地方看起来像这样:

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的最新更新。无论如何,它引起了我的注意,现在我不确定我一直在做什么是正确的:

  • 将对象用作数组键时会发生什么?他们被转换成字符串吗?如果是这样,字符串是否应该是一个唯一的对象(如对象的哈希值)?
  • 总之,我做错了吗?如果是这样,我该怎么做才能解决这个问题?

3 个答案:

答案 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";