使用严格的空检查处理 Typescript 2.0 中的数组移位返回类型

Posted

技术标签:

【中文标题】使用严格的空检查处理 Typescript 2.0 中的数组移位返回类型【英文标题】:Dealing with Array shift return type in Typescript 2.0 with strict null checks 【发布时间】:2017-04-25 10:09:52 【问题描述】:

在我的带有严格空值检查的 Typescript 2.0 项目中,我有一个数组:

private _timers: ITimer[]

和一个 if 语句:

if(this._timers.length > 0)
  this._timers.shift().stop();

但我得到一个编译错误:

Object is possibly 'undefined'

如何让编译器相信它不是未定义的?

我可以这样绕过它:

const timer = this._timers.shift();
if(timer)
  timer.stop();

但这似乎有点过于冗长,并且为了绕过打字限制而不必要地使用变量。

谢谢

【问题讨论】:

【参考方案1】:

non-null assertion operator,在 2.0 发行说明中提到(并将出现在 documentation soon 中),用于完全类似的情况。它是后缀!,它抑制了这个错误:

    if(this._timers.length > 0)
        this._timers.shift()!.stop();
    

另见https://***.com/a/40350534/43848

【讨论】:

太好了,非常感谢。我显然没有仔细阅读发行说明! ☺️ 这正是我处理我之前使用的模式来调用和清除非侦听器列表所需要的:while(cleanupFns.length) cleanupFns.shift()!(); 在检查数组的长度!= 0 之后,TS 仍然认为 shift() 可能存在未定义的原因吗?或者,这是 TS 的错误/问题吗?【参考方案2】:

您确定_timers 已经初始化了吗? 例如:

private _timers: ITimer[] = [];

或者在构造函数中:

constructor() 
    this._timers = [];
    ...

【讨论】:

以上是关于使用严格的空检查处理 Typescript 2.0 中的数组移位返回类型的主要内容,如果未能解决你的问题,请参考以下文章

为啥打字稿在实现抽象函数时忽略严格的空检查?

TypeScript 中的可选参数可以为空吗?

微软编程语言 TypeScript 2.0 发布

如何在颤振发布方法中修复“未处理的异常:用于空值的空检查运算符”

如何修复颤振中的“未处理的异常:用于空值的空检查运算符”错误?

在带有 TypeScript 的 next.js 中使用 Router 的空安全方式