ES6承诺从未输入打字稿

时间:2017-03-23 05:07:02

标签: javascript typescript es6-promise

我有一个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('')
    }
    

1 个答案:

答案 0 :(得分:0)

它是控制流分析和工作中的防护装置。它发现&&之后的分支永远不会被执行,因为在您的代码中myVar 总是一个Promise,并且它通过分配{{{ 1}}在该分支中键入never

拒绝这种错误的良性额外条件可能看起来过于严格,但在其他情况下,它有助于捕获真正的错误。此外,一旦你有正确输入的代码可能会通过任一分支,错误就会消失(但是,控制流分析器将来会变得更聪明,并开始拒绝这个代码):

myVar