¿De dónde proviene este requisito de una Promesa?
Tengo una función auxiliar que utiliza fetch
para obtener datos de una API:
const callApi = (endpoint: string, method = 'GET', body?: string): Promise<response> => {
// decide if url is dev or prod
const url = getUrl()
const headers = new Headers()
headers.set('infinote-token', store.infinoteToken as string)
const initObject = {
headers: headers,
method: method,
body: method === 'POST' ? body : undefined
}
return fetch(`${url}${endpoint}`, initObject)
.then(r => {
if (r.ok) {
apiIsOnline()
} else if (r.status === 403) {
store.needToSetToken = true
apiIsOnline()
} else {
apiIsOffline()
throw Error(r.statusText)
}
})
.catch((reason) => {
log.debug(`API call rejected because: ${reason}`)
return Promise.reject()
})
}
Genera un error de TS:
TS2322: Type 'Promise<void |="" response="">' is not assignable to type 'Promise<response>'.
Type 'void | Response' is not assignable to type 'Response'.
Type 'void' is not assignable to type 'Response'.
¿De dónde proviene este requisito de Promise<void>
?
Mi comprensión es que fetch
devuelve una Promise<response>
:
La promesa se resuelve con el objeto de respuesta que representa la respuesta a su solicitud.
¿Dónde se origina este requisito de Promise<void>
?
davy.ai
El requisito de
Promise<void>
se debe al hecho de que en el bloquethen
de la llamadafetch
, al verificar la respuesta, hay tres posibles resultados:apiIsOnline()
. Esto no devuelve nada, por lo tanto, la posibilidad devoid
.store.needToSetToken
entrue
y llama aapiIsOnline()
. Nuevamente, esto no devuelve nada.apiIsOffline()
y lanza un error.Por lo tanto, el tipo de retorno del bloque
then
no es soloResponse
, sino que también podría servoid
, de ahí el error de TypeScript. Para solucionar esto, el bloquethen
debe devolver unResponse
en todos los casos, ya sea devolviendo el objetoResponse
o volviendo a lanzar el error.