新年快乐:)
我在理解打字稿问题时遇到了一些困难。
我正在尝试将我的js项目转换为ts项目,因为更好的类型强制执行并且更容易捕获错误
现在我有一个类型:
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是“任何”类型,所以在我的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子句可能会返回一个“json”,它是一个any。因此,errorHandle可能会返回一个合法的json,但是tsc编译器认为编译和运行是可以的。更糟糕的是,在返回json时我甚至没有得到运行时错误
我错过了什么吗?
第二个问题:在这种情况下,处理“APIError”和“合法APIResponse”的最佳方式是什么?有什么建议吗?
答案 0 :(得分:1)
这里没有错误,这是预期的行为。 any
类型取消了所有类型安全检查(包括返回值),如果有的话应该谨慎使用。
更糟糕的是,在返回json时我甚至没有得到运行时错误
正如笔记一样,TS不会引入任何新的运行时行为(超出类和装饰器所需的最小位)。类型检查纯粹是在编译时。你永远不应该期望TS的运行时错误处理。
您的第二个问题可能会通过将其作为自己独特的问题发布来获得更多关注。无论如何,你可能想要查看user defined type guards并创建一些在状态字段上运行的东西。