2014-10-09 35 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"; 
相關問題