打字稿类型对承诺类型执行

问题描述:

新年快乐:)打字稿类型对承诺类型执行

我在理解打印稿问题时遇到了一些困难。

我想要我的js项目转换成TS之一,因为更好的类型的执法和虫子捉

容易现在我有一个类型:

export interface APIErrorInfo { 
    code: number, 
    msg: string, 
    status: number 
} 

我打电话来取,它返回一个承诺照常

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”的最佳方法是什么?有什么建议么?

这里没有错误,这是打算的行为。 any类型会取消所有类型的安全检查(包括返回值),应该谨慎使用。

糟糕的是,我甚至没有得到运行时错误而JSON返回

正如一个音符,TS不引入任何新的运行时行为(超出必要的类和装饰的最低位)。类型检查纯粹是在编译时。您绝对不应该期待TS的运行时错误处理。


您的第二个问题可能会通过发布它作为自己独特的问题而获得更多关注。无论如何,你可能想看看user defined type guards并创建一些在状态字段上运行。