Node.js Typescript返回已解析承诺的类型可能性
我想在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
当我用一条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返回是承诺的回调的本地值