2017-01-18 16 views
11

Mam dużą ilość js kodu, który używa wielu asocjacyjnych tablic, które pozwalają na bardzo szybki dostęp do obiektów. Próbowałem więc przenieść ten kod i nie udało mu się. Tak więc nie rozumiem jeszcze wystarczająco dobrze TS.Dlaczego otrzymuję "Typ" ciąg "nie może być używany jako typ indeksu" błąd w TypeScript

Szukałem odpowiedzi na to pytanie i znalazłem sugestie, jak utworzyć interfejs itp. ... ale wydaje się to trochę nie na miejscu.

Więc próbowałem pozornie oczywiste:

class Foo { 
    allObjects: MyObject[]; 
    constructor() { 
    this.allObjects = []; 
    } 
} 

gdzie MyObject - uproszczona:

class MyObject { 
    _id: String; 
    public getId(): String { 
     return this._id; 
    } 
} 

I chciałbym wierzyć, że:

myObjectInstance: MyObject; 
fooInstance.allObjects[myObjectInstance.getId()] = myObjectInstance; 

będzie dobrze ... I JESZCZE zobacz piękny błąd TS2342 (Argument wyrażenia indeksu musi być typu "string", "number" lub "any"), który nie powoduje żadnego wrażenia e do mnie, ponieważ getId() jest ciągiem znaków. Wygląda na to, że nie powinno to być takie trudne. Więc twoja pomoc będzie bardzo mile widziane ...

+0

Możliwy duplikat [Maszynopis: różnica między string i ciąg] (http://stackoverflow.com/questions/14727044/ typecript-difference-between-string-and-string) –

+5

'String' różni się od' string', to znaczy '_id: string;' powinien działać. Potrzebujesz 'String' tylko wtedy, gdy musisz używać' new' z nim, to znaczy prawie nigdy. – artem

+0

Nawiasem mówiąc, termin "tablica asocjacyjna" nie jest używany ani w JavaScript, ani w TypeScript. –

Odpowiedz

41

Korzystanie małe string dla typu MyObject._id

+1

Dziękuję bardzo ... Właśnie to zauważyłem ... "Głupi jest bardzo potężny" :-) – JoelParke

+3

To samo dotyczy małej litery "numer" w moim przypadku. – Leo

+1

Nie mogę w to uwierzyć ... –

Powiązane problemy