假设您有一个抛出特定配置错误的函数:
function throwMyError(): never {
throw new Error("My Custom error")
}
并且您有一个可为空的值:
declare const str: string | null
您可以将该值缩小为不可为空的值,如下所示:
if(!str) throwMyError()
str.toLocaleLowerCase() // fine
现在将该函数调用放入对象文字中,它不能再进行相同的缩小:
const foo = { throwMyError }
if (!str) foo.throwMyError()
str.toLocaleLowerCase() // 'obj' is possibly 'null'.(18047)
或者:
const bar = {
throwMyError: (): never => {
throw new Error()
}
}
if (!str) bar.throwMyError()
str.toLocaleLowerCase() // 'obj' is possibly 'null'.(18047)
当从对象类型调用抛出函数时,为什么缩小不起作用?
可以在不创建类型谓词函数的情况下解决这个问题吗?
相关问题:类型缩小和从不起作用
但这似乎并没有解决这个问题,因为在所有情况下函数类型都被显式注释为返回never