Node.js Typescript返回已解析承诺的类型可能性

Node.js Typescript返回已解析承诺的类型可能性,node.js,typescript,promise,visual-studio-code,typescript-typings,Node.js,Typescript,Promise,Visual Studio Code,Typescript Typings,我想在Typescript中使用严格的返回类型语句。 当我用一条if-then-else语句编写函数时,vscode的TS Linter足够聪明,可以看到accept我的返回值: 如果我尝试在单个.then().catch()块中执行相同的操作(在该块中,函数没有任何其他可能性),那么我的linter将不接受返回类型 兑现承诺也不会起作用(如预期的那样) 我还使用了一个.finally()语句进行了检查,该语句不起作用,不打算在我的情况下使用 资料来源: var myPromise = n

我想在Typescript中使用严格的返回类型语句。
当我用一条if-then-else语句编写函数时,vscode的TS Linter足够聪明,可以看到accept我的返回值:

如果我尝试在单个.then().catch()块中执行相同的操作(在该块中,函数没有任何其他可能性),那么我的linter将不接受返回类型

兑现承诺也不会起作用(如预期的那样)

我还使用了一个.finally()语句进行了检查,该语句不起作用,不打算在我的情况下使用

资料来源:

var myPromise = new Promise(function (resolve, reject) {
    if (Math.round(Math.random()) == 1) {
        resolve("yay")
    } else {
        reject("nay")
    }
});

function returnYayOrNay(): string {
    myPromise
        .then((result) => {
            return result
        })
        .catch((result) => {
            return result
        })
}
编辑1:我想返回如图2所示的字符串

默认情况下,承诺的返回类型为
promise
。因此,您可以键入承诺返回值

var myPromise=新承诺(函数(解析、拒绝){
if(Math.round(Math.random())==1){
解决(“耶”)
}否则{
拒绝(“不”)
}
});
在上面的示例中,返回值变为
Promise

默认情况下,承诺的返回类型为
promise
。因此,您可以键入承诺返回值

var myPromise=新承诺(函数(解析、拒绝){
if(Math.round(Math.random())==1){
解决(“耶”)
}否则{
拒绝(“不”)
}
});
在上面的示例中,返回值变为
Promise


returnYayOrNay
函数的问题在于它不返回字符串。当您使用
时,然后
捕获您在函数中传递的承诺(匿名箭头函数
=>
)。所以
返回结果
只需从这个匿名函数返回即可

我猜您希望返回
myPromise
的值。当调用
returnYayOrNay
时,您不能直接返回此值,
myPromise
的值可能还不可用。所以
returnYayOrNay
也应该返回一个承诺

另外,默认情况下,
myPromise
被键入
Promise{}
,因为typescript无法根据
resolve
reject的用法推断结果的类型

也就是说,您有几个选择:

返回由
然后
捕获
调用装箱的新承诺:

function returnYayOrNay() {
    return myPromise
        .then((result) => {
            return result
        })
        .catch((result : string) => {
            return result
        })
}
使用异步/等待

async function returnYayOrNay() {
    try{
        return await myPromise;
    }catch(e) {
        return e as string;
    }
}

returnYayOrNay
函数的问题在于它不返回字符串。当您使用
时,然后
捕获您在函数中传递的承诺(匿名箭头函数
=>
)。所以
返回结果
只需从这个匿名函数返回即可

我猜您希望返回
myPromise
的值。当调用
returnYayOrNay
时,您不能直接返回此值,
myPromise
的值可能还不可用。所以
returnYayOrNay
也应该返回一个承诺

另外,默认情况下,
myPromise
被键入
Promise{}
,因为typescript无法根据
resolve
reject的用法推断结果的类型

也就是说,您有几个选择:

返回由
然后
捕获
调用装箱的新承诺:

function returnYayOrNay() {
    return myPromise
        .then((result) => {
            return result
        })
        .catch((result : string) => {
            return result
        })
}
使用异步/等待

async function returnYayOrNay() {
    try{
        return await myPromise;
    }catch(e) {
        return e as string;
    }
}

承诺本质上是异步的,你不能从中同步返回。不是被欺骗,但你肯定需要阅读它:@IngoBürk你想说包括一个小异步调用需要重写我完整的同步代码库吗?还有异步等待。我告诉你,你不能同步返回一个只有异步才能知道的结果。我们不能穿越时间。承诺本质上是异步的,你不能从中同步返回。不是被欺骗,但你肯定需要阅读:@IngoBürk你想说包括一个小的异步调用需要重写我完整的同步代码库吗?还有异步等待。我告诉你,你不能同步返回一个只有异步才能知道的结果。我们不能穿越时间。目标是返回字符串。不是承诺。@ErnstErnst每个承诺函数都返回绑定在承诺中的类型。使用
wait
后,将检索绑定在承诺中的类型。因此,在本例中,字符串在
内返回,然后
。目标是返回字符串。不是承诺。@ErnstErnst每个承诺函数都返回绑定在承诺中的类型。使用
wait
后,将检索绑定在承诺中的类型。那么在这种情况下,,字符串在
中返回,然后在
中返回。这两种方法都不起作用,因为在两种解决方案中,typescript强制函数返回为Promise,而在第一种方法中,函数返回是Promise的本地回调。这两种方法都不起作用,因为在两种解决方案中,typescript强制函数返回为Promise,而在第一种方法中,函数返回为Promise返回是承诺的回调的本地值