Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/423.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript ES6 promise从未键入打字脚本_Javascript_Typescript_Es6 Promise - Fatal编程技术网

Javascript ES6 promise从未键入打字脚本

Javascript ES6 promise从未键入打字脚本,javascript,typescript,es6-promise,Javascript,Typescript,Es6 Promise,我有一个if条件,其中我检查变量是否为承诺: if (!(myVar instanceof Promise) && !myVar.then) { // do something... } 出于某种原因,这里typescript抛出一个错误,表示类型“从不”上不存在属性“then”。换句话说,typescript将我的变量myVar视为第二个if谓词中的never类型,即!myVar.then 当我将if条件更改为以下条件时: if (!myVar.then &&

我有一个if条件,其中我检查变量是否为承诺:

if (!(myVar instanceof Promise) && !myVar.then) {
    // do something...
}
出于某种原因,这里typescript抛出一个错误,表示类型“从不”上不存在
属性“then”
。换句话说,typescript将我的变量
myVar
视为第二个
if
谓词中的
never
类型,即
!myVar.then

当我将if条件更改为以下条件时:

if (!myVar.then && !(myVar instanceof Promise)) {
    // do something...
}
一切似乎都很好

为什么会这样?任何帮助都将不胜感激

键入脚本示例:

  • 使用
    然后
    错误:

    let myVar = new Promise(() => { })
    
    if (!(myVar instanceof Promise) && !myVar.then) {
        console.log('')
    }
    
    let myVar = new Promise(() => { })
    
    if (!myVar.then && !(myVar instanceof Promise)) {
        console.log('')
    }
    
  • 没有
    错误:

    let myVar = new Promise(() => { })
    
    if (!(myVar instanceof Promise) && !myVar.then) {
        console.log('')
    }
    
    let myVar = new Promise(() => { })
    
    if (!myVar.then && !(myVar instanceof Promise)) {
        console.log('')
    }
    

这是控制流分析以及工作中的类型防护装置。它发现
&
之后的分支永远不会执行,因为在您的代码中
myVar
总是一个
Promise
,它表示通过将
never
类型分配给该分支中的
myVar

用这样一个错误拒绝良性的额外条件似乎过于严格,但在其他情况下,它有助于捕捉真正的错误。此外,一旦您正确键入了可能通过任一分支的代码,错误就会消失(不过,控制流分析器将来可能会变得更智能,并开始拒绝此代码):


您的逻辑将始终测试
myVar。然后
-除非
myVar
Promise
的实例-这就是您想要的吗?我只想检查变量是否为Promise。我知道只有检查
myVar.then
就足够了。我问这个问题是出于好奇。我无法理解为什么会发生这样的事情,总的来说,有时候会有承诺,而不是别的时候,这是一个可怕的想法。@NahushFarkande-我理解,但是我不知道哪一位代码会发出这个错误——因为其中任何一位都没有错误——代码产生错误的唯一方式是运行
myVar。然后(…)
在if条件内