打字稿错误对象可能为空?为啥,如何禁用?

Posted

技术标签:

【中文标题】打字稿错误对象可能为空?为啥,如何禁用?【英文标题】:Typescript error Object is possibly null? Why, how to disable?打字稿错误对象可能为空?为什么,如何禁用? 【发布时间】:2019-05-12 17:52:02 【问题描述】:

我有以下代码:

private extractInitials(fullname: string): string 
    const initials = fullname
        .replace(/[^a-zA-Z- ]/g, '')
        .match(/\b\w/g)
        .join('')
        .toUpperCase();
    return initials.substring(0, 2);

我遇到了一个错误

[ts] Object is possibly 'null'. [2531]

所以我尝试了 if fullname const initials .... return ... else return '';

原来打字稿在抱怨这个人

fullname.replace(/[^a-zA-Z- ]/g, '')

这是有道理的,因为这最终可能是一个空字符串

原来如此

const t = fullname.replace(/[^a-zA-Z- ]/g, '')
if(t)  /* do the rest */  else return ''

它仍然给了我对象可能为空的错误。我知道不是。我该如何解决?

【问题讨论】:

match 可能为空,因此下划线所在的位置。 “这是有道理的,因为这最终可能是一个空字符串” 不,这没有意义。 "" 不是 null。它们是完全不同的东西。 如果你确信源字符串是非空的,你可以在匹配结果上使用非空断言:.match(/\b\w/g)!——如果文本是空的,你会得到null从那和.join() 将抛出一个错误。 【参考方案1】:

问题是match 可以返回null。如果您想要一个空白字符串作为结果,只需使用|| 技巧¹ 对match 的结果执行|| []

private extractInitials(fullname: string): string 
    const initials =
        (fullname
        .replace(/[^a-zA-Z- ]/g, '')
        .match(/\b\w/g)
        || []
        )
        .join('')
        .toUpperCase();
    return initials.substring(0, 2);

如果你想在这种情况下返回null,你可以使用&&技巧¹返回null如果match结果是null,否则继续你的join等.:

private extractInitials(fullname: string): string 
    const parts = fullname
        .replace(/[^a-zA-Z- ]/g, '')
        .match(/\b\w/g);
    return parts && parts.join('').toUpperCase().substring(0, 2);


¹|| 的技巧是 || 评估其左侧操作数,如果 真实²,则将该值作为结果;否则,它会评估其右手操作数并将该值作为结果。 && 技巧与此类似,只是反过来:它计算左操作数,如果它是 falsy³,则将该值作为结果;否则,它会计算其右侧操作数并将该值作为结果。

² 虚假 - nullundefined""0NaN,或者(当然)false

³ 真实 - 不虚假

【讨论】:

【参考方案2】:

我遇到了类似的问题,就我而言,我所做的只是将以下规则添加到 tsconfig.json

"strictNullChecks": false
"noImplicitAny": false,

这应该做的工作

【讨论】:

谢谢。迄今为止最简单的解决方案:)【参考方案3】:

消除空检查错误的一种可能解决方案是使用Optional Chaining。

const extractInitials = (fullname: string): string  => 
    const initials = fullname.replace(/[^a-zA-Z- ]/g, '').match(/\b\w/g)?.join('').toUpperCase();
    return initials?.substring(0, 2) || '';

如果正则表达式匹配的结果是null,这将返回一个空字符串,否则将返回预期的输出。 您可以尝试在 TS Playground here 中使用不同的值运行它。

这已在另一个答案here 中进行了解释。

【讨论】:

以上是关于打字稿错误对象可能为空?为啥,如何禁用?的主要内容,如果未能解决你的问题,请参考以下文章

打字稿:React Native useRef 给出错误“对象可能为空”

为啥打字稿允许我覆盖一个空的状态对象?

如何在打字稿中设置初始 React 状态?

如果参数为空,则打字稿函数返回类型为空

打字稿'可选'(可为空)'?语法不起作用(部分)

角度打字稿页面上的数组为空