Reactjs 为什么`tslint`报告`TS2531:对象可能是';空';`我用之前都检查过了?
我正在React项目中使用Reactjs 为什么`tslint`报告`TS2531:对象可能是';空';`我用之前都检查过了?,reactjs,typescript,tslint,Reactjs,Typescript,Tslint,我正在React项目中使用typescript。我在typescript中有以下代码: if(this.state.deletedItem !== null) { this.props.deleteItem({refItemIdx: this.state.deletedItem.itemIdx}); } tslint给我一个错误TS2531:对象可能为“null”。对象this.state.deletedetem.itemIdx。它说
typescript
。我在typescript
中有以下代码:
if(this.state.deletedItem !== null) {
this.props.deleteItem({refItemIdx: this.state.deletedItem.itemIdx});
}
tslint给我一个错误TS2531:对象可能为“null”。
对象this.state.deletedetem.itemIdx
。它说this.state.deletedItem
可以为空。但是我已经在if
条件下检查了它,为什么它仍然报告这样的错误
以下是类型定义:
interface State {
deletedItem: ItemDiscountTranItem | null;
}
export class MainView extends React.Component<Props, State> {
state = {
deletedItem: null,
};
...
我尝试了以下语法,但仍然得到相同的错误:
this.props.voidItemDiscount({refItemIdx: this.state.deletedItem && this.state.deletedItem.itemIdx});
这一行表示:+
deletedItem
必须处于状态
+
deletedItem
可以为空因为它可能是
null
,并且必须同时存在调用
{emidx:this.state.deletedItem.itemIdx}
deletedItem
可能是null
,然后javascript将抛出错误,类似这样的无法读取null的属性itemIdx
,排序。typescript
帮助您首先指出TS2531:对象的问题可能为“null”。
以防止进一步的错误。因此,您应该这样声明您的接口:
interface State {
deletedItem?: ItemDiscountTranItem;
}
{emidx:this.state.deletedetem&&this.state.deletedetem.itemIdx}
这表明:+您可以或可以在界面中设置
deletedItem
+而
deletedItem
是ItemDiscountTranItem
您可以通过检查
this.state.deletedItem
是否存在来获取值,然后从中获取itemIdx
============================这只是我的想法,如果你考虑使用它是很好的。 也就是说,我通常让
变量
或与全局上下文
或应用程序状态
相关的东西在您的情况下为状态
使用默认值并尽可能减少
null
和undefined
您可以这样声明您的状态
deletedItems:ItemDiscountTranItem[]
,
这个声明没有坏处,事实上,它帮助您的代码更具可读性和可扩展性,
例如:只需
如果(state.deletedItems.length)
您甚至可以进一步循环抛出
deletedItems.forEach的列表
接下来呢?你甚至不必绞尽脑汁想什么时候应该是null
它是未定义的吗?或者我应该什么时候检查?你可以把这些都忘了。
因为它现在很简单,所以您想delete
something?您检查是否有要删除的内容,是否要删除更多内容
?你绕圈子<代码>足够简单
我的代码的问题是,我将我的组件类声明为class MainView extensed React.component
。此处的状态
仅表示组件状态从此类扩展而来。因此,下面定义的组件状态有一个狭窄的state
类型,即null
state = {
deletedItem: null,
};
下面的更改修复了我的问题:
state: State = {
deletedItem: null,
};
我尝试过这种方法,但它给了我同样的错误。你可以尝试{emidx:this.state.deletedetem&&this.state.deletedetem.itemIdx}
oops,对不起,我忘记了你声明的接口,我已经编辑了答案,希望能有所帮助。在我的应用程序中状态deletedetedetem
可以为空。我该怎么处理呢?我解决了问题并给出了答案。请让我知道你的想法是的,如果它有效的话,那就去吧,但是我已经用我的想法编辑了我的答案,希望它对你有帮助。
state = {
deletedItem: null,
};
state: State = {
deletedItem: null,
};