[英]Typescript type enforce on promise types
新年快乐 :)
我在理解打字稿问题时遇到了一些困难。
我正在尝试将我的js项目转换为ts项目,因为更好的类型执行和更容易的bug捕获
现在我有一个类型:
export interface APIErrorInfo {
code: number,
msg: string,
status: number
}
我在叫fetch,它像往常一样返回一个承诺
get(path: string) {
this.signApiCall(path, "GET", null)
return fetch("http://" + this.apiHost + path,
{
method: "GET",
headers: this.headers
}
).then(
json => {
return this.errorHandle(json)
}
)
}
在这里,我了解json是“ any”类型,因此在我的errorHandle中,
errorHandle(jsonPromise: any): Promise<APIErrorInfo> {
let json = jsonPromise.json()
if(jsonPromise.status >= 400) {
return json.then(err => {throw qiniuErrorHandle(jsonPromise.status)})
} else {
return json
}
}
const qiniuErrorHandle = (code): APIErrorInfo => {
switch(true) {
case code === 111:
return {msg: "blah1", code: APICode.StreamExists, status: HTTPStatus.BadRequest}
case code === 222:
return {msg: "blah2", code: APICode.StreamDoNotExist, status: HTTPStatus.BadRequest}
case code === 333:
return {msg: "blah3", code: APICode.StreamHasNoData, status: HTTPStatus.BadRequest}
default:
return {msg: "Unknown error", code: APICode.UnknownError, status: HTTPStatus.InternalError}
}
}
除了这里的返回类型,一切都很好。 我要求errorHandle仅返回Promise(我知道应该是错误的?),但是if else子句可能会返回“ any”(任意)。 因此,errorHandle可能返回合法的json,但是tsc编译器认为可以编译和运行。 更糟糕的是,返回json时,我什至没有得到运行时错误
我想念什么吗?
第二个问题:在这种情况下,处理“ APIError”和“合法APIResponse”的最佳方法是什么? 有什么建议么?
这里没有错误,这是预期的行为。 any
类型都将取消所有类型的安全检查(包括返回值),并且应尽可能少用。
更糟糕的是,返回json时,我什至没有得到运行时错误
只需说明一下,TS不会引入任何新的运行时行为(超出类和装饰器所需的最低限度)。 类型检查仅在编译时进行。 您永远都不应期望从TS处理运行时错误。
将第二个问题作为自己的独立问题发布,可能会引起更多关注。 无论如何,您可能要研究用户定义的类型防护,并创建一些在状态字段上运行的防护 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.