2014-10-09 29 views
3

我有我的代码,有些地方看起来像这样:错误TS2342:索引表达式参数的类型必须是“字符串”,“数字”,或“任意”

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

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]); 
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"; 
相关问题