我有以下代码:
shift
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错误的提示。我知道不是。我该如何解决?
答案 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 ³,则以该值作为结果;否则,它将评估其右侧操作数并将该值作为结果。
²虚假-null
,undefined
,""
,0
,NaN
或(当然){{ 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中也对此进行了解释。