Objekt-Index-Schlüsseltyp in Typescript

7

Ich habe meinen generischen Typ als

definiert %Vor%

Aber TSLint beschwert sich. Wie soll ich einen Objekt-Indextyp definieren, der entweder als Schlüssel verwendet werden kann? Ich habe das auch versucht, aber kein Glück.

%Vor%

Keine der oben genannten Arbeiten.

Also wie dann?

    
Robert Koritnik 26.01.2017, 09:32
quelle

3 Antworten

10

Sie können das erreichen, indem Sie einfach a IDictionary<TValue> { [key: string]: TValue } , da numerische Werte automatisch in Zeichenfolgen konvertiert werden.

Hier ist ein Anwendungsbeispiel:

%Vor%     
Nickeat 26.01.2017, 10:00
quelle
12

In JavaScript können die Schlüssel des Objekts nur Zeichenfolgen sein (und auch in es6 -Symbolen).
Wenn Sie eine Zahl übergeben, wird sie in eine Zeichenfolge konvertiert:

%Vor%

Wie Sie sehen, erhalten Sie immer { [key: string]: TValue; } .

Typescript können Sie eine Karte wie folgt mit number s als Schlüssel definieren:

%Vor%

Und der Compiler wird überprüfen, dass Sie bei der Zuweisung von Werten immer eine Zahl als Schlüssel übergeben, aber in der Laufzeit werden die Schlüssel im Objekt Strings sein.

Sie können entweder { [key: number]: string } oder { [key: string]: string } haben, aber nicht eine Union von string | number , weil:

%Vor%

Sie könnten erwarten, dass d hier zwei verschiedene Einträge hat, aber tatsächlich gibt es nur einen.

Was Sie tun können, ist ein Map :

%Vor%

Hier haben Sie zwei verschiedene Einträge.

    
Nitzan Tomer 26.01.2017 09:44
quelle
0

Obwohl Objektschlüssel immer Zeichenfolgen unter der Haube sind und Indexer als Zeichenfolgen Zahlen umfassen, möchten Sie manchmal, dass eine Funktion die Schlüssel von Objekten kennt, die an sie übergeben werden. Betrachten Sie diese Zuordnungsfunktion, die wie Array.map funktioniert, aber mit Objekten:

%Vor%

key ist auf string beschränkt und der Wert ist vollständig untypisiert. Wahrscheinlich in Ordnung 9 von 10 Mal, aber wir können es besser machen. Nehmen wir an, wir wollten so etwas albernes machen:

%Vor%

Wir können keine arithmetischen Operationen für den Schlüssel durchführen, ohne zuerst eine Zahl zu erzeugen (beachte: "3" / 2 ist in JS gültig und wird in number aufgelöst). Wir können das mit ein bisschen kniffligem Tippen auf unserer Kartenfunktion umgehen:

%Vor%

Hier verwenden wir das generische S , um unser Objekt zu schreiben, und suchen direkt nach Schlüssel- und Werttypen. Wenn Ihr Objekt mit generischen Indexern und Werten typisiert wird, werden keyof S und S[keyof S] zu konstanten Typen aufgelöst. Wenn Sie ein Objekt mit expliziten Eigenschaften übergeben, wird keyof S auf die Eigenschaftsnamen und S[keyof S] auf die Eigenschaftswerttypen beschränkt.

    
Sandy Gifford 05.02.2018 18:09
quelle