繁体   English   中英

Typescript类型对Promise类型实施

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM