es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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>?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El requisito de Promise<void> se debe al hecho de que en el bloque then de la llamada fetch, al verificar la respuesta, hay tres posibles resultados:

    1. Si la respuesta es OK, llama a apiIsOnline(). Esto no devuelve nada, por lo tanto, la posibilidad de void.
    2. Si el estado de respuesta es 403, establece store.needToSetToken en true y llama a apiIsOnline(). Nuevamente, esto no devuelve nada.
    3. Si la respuesta es cualquier otra cosa, llama a apiIsOffline() y lanza un error.

    Por lo tanto, el tipo de retorno del bloque then no es solo Response, sino que también podría ser void, de ahí el error de TypeScript. Para solucionar esto, el bloque then debe devolver un Response en todos los casos, ya sea devolviendo el objeto Response o volviendo a lanzar el error.

Comments are closed.