Angenommen, wir haben TypeScript-Code, der wie folgt aussieht:
type User = {
id: number,
name: string,
}
let user1: User = {id: 123, name: "Hello"};
let user2: User = {id: 456, name: "World"};
let keys: (keyof User)[] = ["id", "name"];
for (let key of keys) {
user1[key] = user2[key];
}
Dies gibt einen Fehler
Type 'string | number' is not assignable to type 'never'.
für die Aussage
user1[key] = user2[key];
Wenn wir die Definition von keys
zu ändern
let keys: string[] = ["id", "name"];
Der Fehler verschwindet, aber wir verlieren die Typensicherheit.
Gibt es eine Möglichkeit, diesen Fehler zu vermeiden, während die Typensicherheit erhalten bleibt?
typescript
keyof
Vaibhav K.
quelle
quelle
let keys: string[]
entfernt den Fehler, führt aber einen anderen ein, da TS dies nicht garantieren kannuser1[key]
oderuser2[key]
gültig ist.let keys: string[]
führt ein weiteres Problem ein, aber das wäre ein Laufzeitfehler (wenn das Array zufällig einen nicht vorhandenen Feldnamen als Wert enthält). Was wir suchen, ist eine Überprüfung der Kompilierungszeit, um dies zu vermeiden.Antworten:
Es gibt hier keine gute Möglichkeit, eine Typzusicherung zu vermeiden. In der neueren Version von TS (Post 3.5, glaube ich) muss der geschriebene Wert beim Schreiben durch einen Index mit allen möglichen Eigenschaftswerten kompatibel sein, die vom Schlüssel angegeben werden. In Ihrem Fall würde sich
number & string
das aufnever
den Fehler reduzieren .Die Hauptursache ist, dass TS nicht nur Variablen von Typen verfolgt. Was die Typen betrifft, unterscheidet sich Ihr Beispiel nicht von:
Die einfachste Lösung besteht darin, eine Typzusicherung zu verwenden, wenn Sie, wie in Ihrem Fall, sicher sind, dass dies in Ordnung ist:
abspielen
Alternativ (aber nicht mehr typsicher) können Sie eine kleine Lücke verwenden, die dem
T[K]
Indexwert zugewiesen werden kann:abspielen
quelle
as never
funktioniert. Können Sie dieset
Methode auch im zweiten Beispiel erläutern ?