我有一个if条件,我在检查变量是否是一个承诺:
if (!(myVar instanceof Promise) && !myVar.then) {
// do something...
}
由于某些原因,打字稿会引发错误Property 'then' does not exist on type 'never'
。换句话说,打字稿正在考虑我的变量myVar
在第二个never
谓词中属于if
,即!myVar.then
。
当我将if条件更改为以下内容时:
if (!myVar.then && !(myVar instanceof Promise)) {
// do something...
}
一切似乎都很好。
为什么会这样?任何帮助将不胜感激
Typescript playground示例:
then
错误:
let myVar = new Promise(() => { })
if (!(myVar instanceof Promise) && !myVar.then) {
console.log('')
}
没有then
错误:
let myVar = new Promise(() => { })
if (!myVar.then && !(myVar instanceof Promise)) {
console.log('')
}
答案 0 :(得分:0)
它是控制流分析和工作中的防护装置。它发现&&
之后的分支永远不会被执行,因为在您的代码中myVar
总是一个Promise
,并且它通过分配{{{ 1}}在该分支中键入never
。
拒绝这种错误的良性额外条件可能看起来过于严格,但在其他情况下,它有助于捕获真正的错误。此外,一旦你有正确输入的代码可能会通过任一分支,错误就会消失(但是,控制流分析器将来会变得更聪明,并开始拒绝这个代码):
myVar