Digamos que você tenha uma função que gera um erro configurado especificamente:
function throwMyError(): never {
throw new Error("My Custom error")
}
E você tem um valor anulável:
declare const str: string | null
Você poderia restringir esse valor a algo não anulável como este:
if(!str) throwMyError()
str.toLocaleLowerCase() // fine
Agora coloque essa chamada de função em um objeto literal e ela não poderá mais fazer o mesmo estreitamento:
const foo = { throwMyError }
if (!str) foo.throwMyError()
str.toLocaleLowerCase() // 'obj' is possibly 'null'.(18047)
Ou:
const bar = {
throwMyError: (): never => {
throw new Error()
}
}
if (!str) bar.throwMyError()
str.toLocaleLowerCase() // 'obj' is possibly 'null'.(18047)
Por que o estreitamento não funciona quando a função de lançamento é chamada a partir de um tipo de objeto?
Isso pode ser resolvido sem criar uma função de predicado de tipo?
Consulte Playground datilografado
Pergunta relacionada: Estreitamento de tipo e nunca funciona
Mas isso não parece resolver esta questão porque em todos os casos o tipo de função é explicitamente anotado para retornarnever