如何解决避免在诺言回报上进行类型转换
我有一个动作,可以对API响应进行如下计算
try {
const data = await FooService.request();
someCalculation1(data as FooServiceData);
someCalculation2(data as FooServiceData);
someCalculation3(data as FooServiceData);
someCalculation4(data as FooServiceData);
} catch(err) {
console.log(err)
}
问题是,这很烦人,而且不太可读,每次都要重新键入as SomeServiceData
,但是我相信有必要这样做,因为我的FooService.request
具有这种实现方式
request(): Promise<SomeServiceData | Error> {
return callApi()
.then(res => {
return res as SomeServiceData;
})
.catch(err => {
console.log(err)
return Error("Some error")
})
}
由于函数可以返回每个SomeServiceData
或Error
,因此它迫使我强制转换类型。但是,要点是data
永远不会是Error
类型,因为如果是,那么它将不会抛出错误,并且err
将是Error
类型。但是我无法弄清楚如何避免这种投射。
我认为将Promise
格式的服务更改为async
/ await
格式,但是我认为它根本不会改变行为。
解决方法
一方面,您可以键入data
本身而不是参数表达式:
const data = (await FooService.request()) as FooServiceData;
但是听起来您想抓住request
的主叫人,而不是request
本身-在{{1} },以便在出现错误时,调用方将对其进行处理。 (您的当前代码会导致.catch
是实际的错误,因为request
会导致Promise能够解决返回的错误。)
尝试:
data
.catch
甚至
try {
const data = await FooService.request();
someCalculation1(data);
// ...
} catch(err) {
console.log(err)
}
,
但是关键是数据永远不会是Error类型,因为如果是,那么它将不会抛出错误,而err将是Error类型。
这是不正确的。由于您正在捕获Error
中的API错误并在发生这种情况时返回request()
,因此Promise可能会在您的实现中解析为new Error
对象。 catch
可以防止引发错误。
您需要检查try/catch
的类型以区分data
和Error
,而不是执行操作中的SomeServiceData
块。您可以将if ( data instanceof Error )
用作type guard,并且在两个分支中,打字稿知道只能是该类型。
const data = await FooService.request();
if ( data instanceof Error ) {
// data is Error
console.log(data.message);
} else {
// data is SomeServiceData
someCalculation1(data);
}
或者,如果您想在操作中保留try/catch
块,则需要更改FooService.request()
,以便它引发错误而不是捕获错误。基本上,您只需要在两个位置之一中捕获错误。一旦被抓住,就不会再次抛出。
const FooService = {
async request(): Promise<SomeServiceData> {
return await callApi() as SomeServiceData;
}
}
现在,诺言只能解析为SomeServiceData
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。