2017-05-07 8 views
2

WintellectNowはTypeScriptチュートリアルに従います。第五部分的に著者のソートおよびフィルタリング以下のようなオプションのプロパティとのインタフェースを作成します。タイプ 'undefined'をインデックスタイプとして使用することはできません

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

以下のようWidgetTableCols呼ばれる列挙型がある:

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

関数で著者はの値を取得します

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

ここで私は取得していますタイプ '未定義'は、インデックスタイプとして使用することはできません。私は削除しますか?インタフェースからは動作しますが、後で作者は状態値の1つのみを設定する別の関数を作成し、typescriptはすべての状態プロパティが設定されているわけではないことを示します。

誰でも私にこの問題の解決方法を教えてもらえますか?

ありがとうございます。

+0

あなたは 'strictNullChecks'を使用していますか? –

+0

はいstrictNullChecksがtrueです。私はそれを偽に変更しました。今はその仕事。 –

答えて

5

フラグが設定されているため、コンパイラはthis.state.sortColに値がない可能性があることを伝えます。

あなたが最初にそれの存在を確認することができます。エラーを削除します

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

(しかし、あなたがしてfNameがNULLとなる可能性があるという事実に対処する必要があります)。

またNon-null assertion operatorを使用することができます。

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

あなたはそれが存在することを確認していた場合。

+0

説明をありがとう。非NULLアサーション演算子を使用します。 –

+0

Javascriptでは、undefinedをインデックスタイプとして使用できます。したがって、次のように動作します:x = {}; x [未定義] = 3;なぜタイスクリプトはそれを許さないのですか? – Aaron

+0

オブジェクトのjsキーの@Aaronは、この 'x [undefined] = 3;を実行しているときに**常に**文字列であり、基本的に' x ["undefined"] = 3; 'を取得しています。 Typescriptはあなたにそれを認識させるだけです。 –

関連する問題