我想在Typescript中使用严格的return type语句。
当我用单个if-then-else语句编写函数时,vscode的TS Linter很聪明,可以接受我的返回值:
如果我尝试在单个.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:我想返回一个与Picture2中一样的字符串
答案 0 :(得分:1)
returnYayOrNay
函数的问题在于它不返回字符串。当您使用诺言的then
和catch
时,您正在传递一个函数(匿名箭头函数=>
)。因此return result
仅从该匿名函数返回。
我的猜测是您想返回myPromise
的值。您无法直接返回此值,因为调用returnYayOrNay
时myPromise
的值可能尚不可用。因此returnYayOrNay
也应返回一个承诺。
也将myPromise
的默认键入为Promise{}
,因为打字稿无法根据resolve
和reject
的使用来推断结果的类型
话虽如此,您有几种选择:
返回由then
,catch
调用创建的新承诺:
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;
}
}
答案 1 :(得分:0)
默认情况下,promise的返回类型为
Promise<{}>
。因此,您可以强制转换Promise返回值。
var myPromise = new Promise<string>(function (resolve, reject) {
if (Math.round(Math.random()) == 1) {
resolve("yay")
} else {
reject("nay")
}
});
在上述示例中,返回值变为
Promise<string>
。