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.
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:
Wie Sie sehen, erhalten Sie immer { [key: string]: TValue; }
.
Typescript können Sie eine Karte wie folgt mit number
s als Schlüssel definieren:
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:
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
:
Hier haben Sie zwei verschiedene Einträge.
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:
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:
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:
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.
Tags und Links typescript typescript-generics