typescript - Fel TS2342: Ett indexuttrycksargument måste vara av typen 'string', 'number' eller 'any'
Jag har några ställen i min kod som ser ut så här:
var array = [];
MyClass myObject = new MyClass();
array[myObject] = "something";
I princip använder jag objekt som nycklar i min array. Jag tänkte inte så mycket på det eftersom det känns naturligt, koden kompileras utan problem och jag har inte stött på några buggar på grund av detta.
Idag gjorde jag en kodpush på en orelaterad del av koden och Travis klagade:
error TS2342: An index expression argument must be of type 'string', 'number', or 'any'.
på raden array[myObject]="something";
Jag tror att detta beror på en nylig uppdatering av tsc. Hur som helst, det uppmärksammar mig på detta problem, och nu är jag inte säker på om det jag har gjort är korrekt:
- Vad händer när du använder objekt som nycklar i en array? Omvandlas de till strängar? Om så är fallet, ska strängen som skapas från ett objekt vara unik (som objektets hash-värde)?
- Kort sagt, gör jag det på fel sätt? Om så är fallet, vad bör jag göra för att lösa detta problem?
Svar #1
I princip använder jag objekt som nycklar i min array.
Dålig idé. JavaScript stöder inte objekt som nycklar. Det anropar toString på objekt för att få en strängrepresentation innan indexering.
Åtgärd: använd en makeString-funktion. Kolla in: https://github.com/basarat/typescript-collections#a-sample-on-dictionary för ett exempel
Svar #2
Alla nycklar (alla nycklar) av objekt i JavaScript är strängar. Standardbeteendet för objekt i JavaScript, när de konverteras till en sträng, är att producera "[object Object]". Jag är ganska förvånad över att du inte har stött på en bugg med detta ännu, eftersom det är helt trasigt att använda objekt som nycklar:
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]);
