2017-05-07 939 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(); 

在這裏我越來越類型'undefined'不能被用作索引類型。如果我刪除?從接口它的作品,但後來作者創建另一個功能,只設置一個狀態值和打字稿說並不是所有的狀態屬性都設置。

任何人都可以讓我知道如何解決這個問題。

在此先感謝。

+0

您是否在使用'strictNullChecks'? –

+0

是的strictNullChecks是真的。我將它改爲false。現在它的工作。 –

回答

5

編譯器只是告訴你,this.state.sortCol可能沒有值,因爲你打開了strictNullChecks標誌。

你可以先檢查它的存在:

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

感謝您的解釋。將與非空斷言運算符一起去。 –

+0

Javascript允許undefined被用作索引類型。所以下面的工作:x = {}; x [undefined] = 3;爲什麼打字稿不允許? – Aaron

+0

@Aaron在js對象中的鍵總是**字符串,當你這樣做時x [undefined] = 3;'你基本上得到這個'x [「undefined」] = 3;'。打字稿只是迫使你承認這一點。 –