新年快乐:)
我在理解 typescript 问题时遇到一些困难。
我正在尝试将我的 js 项目转换为 ts 项目,因为更好的类型执行并且更容易捕获错误
现在我有一个类型:
export interface APIErrorInfo {
code: number,
msg: string,
status: number
}
我正在调用 fetch,它会像往常一样返回一个 promise
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 子句可能返回一个“json”,它是一个 any。因此,errorHandle 可能返回一个合法的 json,但 tsc 编译器认为可以编译和运行。更糟糕的是,当返回 json 时我什至没有收到运行时错误
我错过了什么吗?
第二个问题:在这种情况下处理“APIError”和“legit APIResponse”的最佳方法是什么?有什么建议吗?
最佳答案
这里没有错误,这是预期的行为。 any
类型消除了所有类型安全检查(包括返回值),因此应谨慎使用(如果有的话)。
Worse, I didn't even get runtime error while json is returned
请注意,TS 没有引入任何新的运行时行为(除了类和装饰器所需的最小部分之外)。类型检查纯粹是在编译时进行的。您永远不应该期望 TS 处理运行时错误。
<小时/>您的第二个问题可能会通过将其作为自己的独特问题发布来获得更多关注。无论如何,您可能想查看 user defined type guards并创建一些对状态字段进行操作的内容。
关于javascript - Typescript 类型对 Promise 类型强制执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41422353/