Reactjs 为什么`tslint`报告`TS2531:对象可能是';空';`我用之前都检查过了?

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。它说

我正在React项目中使用
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,
};