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

时间:2018-12-11 17:21:11

标签: javascript typescript

我有以下代码:

shift

我遇到错误 enter image description here

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, '')

它仍然给我该对象可能是null错误的提示。我知道不是。我该如何解决?

3 个答案:

答案 0 :(得分:5)

问题是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);
}

¹||的诀窍是||评估其左操作数,如果它是 truthy ²,则以该值作为结果;否则,它将评估其右手操作数,并将该值作为结果。 &&的窍门与此类似,反之亦然:它评估其左操作数,如果它是 falsy ³,则以该值作为结果;否则,它将评估其右侧操作数并将该值作为结果。

²虚假-nullundefined""0NaN或(当然){{ 1}}

³真实-不虚伪

答案 1 :(得分:0)

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

"strictNullChecks": false
"noImplicitAny": false,

那应该做的

答案 2 :(得分:0)

消除空检查错误的一种可能解决方案是使用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游乐场here中以不同的值运行它。

在另一个答案here中也对此进行了解释。