TypeScript TS7015-Fehler beim Zugriff auf eine Enumeration mit einem String-Typ-Parameter

10

Ich bin neu in TypeScript und ich verstehe nicht, was ich tun muss, um die Zeile zu reparieren, die den TS7015-Fehler erzeugt (Verweis auf ein enum-Element mit einer String-Variablen), weil die unmittelbar folgende Zeile keinen Fehler enthält (referenziert) Ein Enum-Member mit einem String-Literal):

%Vor%

"noImplicitAny": true wird im tsconfig.json des Projekts gesetzt, wenn der Fehler erkannt wurde

"noImplictAny": false wird im tsconfig.json des Projekts gesetzt, es wurde kein Fehler festgestellt

Ich kompiliere mit "ntypescript": "^1.201603060104.1"

Ich kompiliere jetzt mit "tsc": "1.8.10"

%Vor%

Überprüfung der Installation:

%Vor%

Hier ist meine tsconfig.json -Datei:

%Vor%

Hier ist die Compiler-Ausgabe:

%Vor%     
Neoheurist 30.03.2016, 18:01
quelle

4 Antworten

11

Ich vermute, dass dies mit der neuen Unterstützung von TS 1.8.x für Zeichenfolgenliterale in diesen Situationen zu tun hat. TS weiß, dass "Happy" ein gültiger String-Index ist, aber es weiß nicht, ob enumKey sein wird oder nicht. Sie können es beheben, indem Sie es wie folgt in ein <any> umwandeln:

%Vor%

(Übrigens, ich denke das ist neu: Ich konnte diesen Fehler nicht mit 1.8.9 reproduzieren, aber sobald ich auf 1.8.10 aktualisiert habe, könnte ich das.)

Interessanterweise hätte ich auch erwartet, dass dies ohne den Fehler funktioniert, aber es nicht:

%Vor%

Muss etwas über die TS-Spezifikation sein, die ich nicht verstehe, oder vielleicht sind sie einfach noch nicht dazu gekommen, dieses Bit zu reparieren.

    
Ken Smith 14.04.2016, 15:07
quelle
25

Wenn Sie TypeScript 2.1+ verwenden, können Sie den Typ enumKey wie folgt in keyof typeof State ändern:

%Vor%

oder, wenn die Eingabe der Funktion ein string sein muss, dies:

%Vor%

Erläuterung:

Der Fehler wird generiert, weil TypeScript, das eine beliebige Zeichenfolge ist, nicht weiß, ob enumKey der Name eines Mitglieds von State ist. TypeScript 2.1+ führte den Operator keyof ein, der eine Vereinigung der bekannten öffentlichen Eigenschaften eines Typs zurückgibt. Mit keyof können wir feststellen, dass die Eigenschaft tatsächlich im Zielobjekt ist.

Beim Erstellen einer Enumeration erzeugt TypeScript jedoch sowohl einen Typ (der immer ein Untertyp von number ist) als auch einen Wert (das enum-Objekt, das Sie können in Ausdrücken referenzieren). Wenn Sie keyof State schreiben, erhalten Sie tatsächlich eine Vereinigung der wörtlichen Eigenschaftsnamen von number . Um stattdessen die Eigenschaftsnamen des Enum-Objekts zu erhalten, können Sie keyof typeof State verwenden.

Quellen:

Ссылка Ссылка

    
Steven Barnett 01.02.2017 02:31
quelle
2

Sie können diesen Fehler mit der Compileroption verhindern, ohne die gesamten strengen Nullprüfungen zu verlieren

%Vor%     
Holger 06.12.2016 14:10
quelle
2
%Vor%

Das musste ich machen, um den Compiler glücklich zu machen

    
Sharpiro 04.09.2016 20:44
quelle

Tags und Links