2017-05-07 43 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;'。打字稿只是迫使你承认这一点。 –

相关问题