2017-05-07 5 views
2

Ich folge WintellectNow Reagieren mit TypeScript Tutorial. Sortieren und Filtern des Autors Im fünften Teil schafft eine Schnittstelle mit optionalen Eigenschaften wie unten:Typ 'undefined' kann nicht als Indextyp verwendet werden

interface IWidgetToolState { 
    filterCol?: WidgetTableCols; 
    filterValue?: string; 
    sortCol?: WidgetTableCols; 
} 

Es eine Enumeration WidgetTableCols wie unten genannt ist:

enum WidgetTableCols { 
    None, Name, Color, Size, Quantity, Price, 
} 

In Abhängigkeit der Autor den Wert bekommt von Enumeration wie folgt aus:

const fName: string = 
WidgetTableCols[this.state.sortCol].toLocaleLowerCase(); 

Hier bin ich immer Typ ‚undefined‘ kann nicht als Index-Typ verwendet. Wenn ich entferne? von der Schnittstelle funktioniert es, aber später erstellt der Autor eine andere Funktion, die nur einen der Statuswerte einstellt, und Typoskript sagt, dass nicht alle Statuseigenschaften gesetzt sind.

Kann jemand mich wissen lassen, wie man dieses Problem löst.

Vielen Dank im Voraus.

+0

Verwenden Sie 'strictNullChecks'? –

+0

Ja strictNullChecks ist wahr. Ich habe es auf falsch geändert. Jetzt geht es. –

Antwort

5

Der Compiler teilt Ihnen mit, dass this.state.sortCol möglicherweise keinen Wert hat, weil Sie das Flag strictNullChecks aktiviert haben.

können Sie zuerst für sie überprüfen die Existenz:

const fName = this.state.sortCol != null ? 
WidgetTableCols[this.state.sortCol].toLocaleLowerCase() : null; 

, die den Fehler beseitigen wird (aber Sie werden dann mit der Tatsache befassen müssen, dass fName null sein kann).

können Sie auch die Non-null assertion operator verwenden:

const fName: string = 
WidgetTableCols[this.state.sortCol!].toLocaleLowerCase(); 

Wenn Sie sicher sind, dass es existiert.

+0

Danke für die Erklärung. Wird mit Nicht-Null-Assertion-Operator gehen. –

+0

Javascript erlaubt undefined, als ein Indextyp verwendet werden. So funktioniert das folgende: x = {}; x [undefiniert] = 3; Warum erlaubt Typoskript das nicht? – Aaron

+0

@Aaron in js Tasten von Objekten sind ** immer ** Zeichenketten, wenn Sie dies tun 'x [undefined] = 3;' Sie bekommen im Grunde diese 'x [" undefined "] = 3;'. Typoskript zwingt Sie dazu, dies zu bestätigen. –

Verwandte Themen