javascript - Typescript 类型对 Promise 类型强制执行

标签 javascript typescript fetch typescript2.0

新年快乐:)

我在理解 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/

相关文章:

javascript - 如何在 google-code-prettify 中包装长代码行

javascript - 标准化 TS 和 Babel 之间的默认导入的正确方法是什么?

android - 未处理的 promise 拒绝 : TypeError: Network request failed expo node backend

javascript - 在ReactJS中获取数据

ios - 核心数据: Grouping Entities by Entitiy Attribute

javascript - 如何从 JSON 中重新选择值

javascript - 向 jquery 宝丽来画廊添加缩放功能

TypeScript 安装/版本错误 : The term 'tsc' is not recognized

angular - 无法加载资源 : the server $%7Bthis. originUrl%7D/.auth/me:1 状态 404(未找到)

javascript - 下拉菜单 - slideToggle 挑战