2017-01-02 3 views
0

С Новым годом :)Тип машинописного типа на уровне обещаний

У меня возникли трудности с пониманием проблемы с машинописными текстами.

я пытаюсь преобразовать мой JS проект в т.с. один, так как лучшее исполнение типа и легче ошибки отлова

Теперь у меня есть тип:

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 вернуть только обещание (которое, как я знаю, должно быть не так?), Но предложение if else может вернуть «json», который является любым. Таким образом, возможно, что ошибкаHandle возвращает законный json, но tsc-компилятор считает, что это нормально для компиляции и запуска. Хуже того, я даже не получил ошибку времени выполнения, в то время как json возвращается

Я что-то упустил?

Второй вопрос: какой лучший способ справиться с «APIError» и «legal APIResponse» в этом случае? Какие-либо предложения?

ответ

1

Здесь нет ошибки, это предполагаемое поведение. any типы уничтожают все проверки безопасности типа (включая возвращаемое значение) и должны использоваться экономно, если вообще.

Хуже того, я даже не получаю ошибку во время выполнения в то время как JSON возвращается

Так же, как примечание, TS не вносит каких-либо новое поведение во время выполнения (за пределами минимального бита, необходимого для классов и декораторов). Проверка типов выполняется только во время компиляции. Вы никогда не должны ожидать обработки ошибок во время выполнения из TS.


Ваш второй вопрос может привлечь больше внимания, разместив его как отдельный вопрос. В любом случае, вы можете посмотреть в user defined type guards и создать некоторые, которые работают в поле статуса.