Búsqueda de sitios web

typescript - El guardia de tipo instanceof no puede reducir el tipo de una variable utilizada dentro de un callback


const userAPI = {
  async getById() { }
}

const batchedUpdates = (callback: () => any) => {
  callback();
}
const setError = (error: Error | null) => { }

async function main() {
  const result: { error: Error | null, data: any | null } = {
    error: null,
    data: null
  }
  try {
    const user = await userAPI.getById();
  } catch (error) {
    if (error instanceof Error) {
      result.error = error;
      batchedUpdates(() => {
        setError(error);
      })
    }
  }
}

Se produjo un error en la línea de la instrucción setError(error):

El argumento de tipo 'unknown' no se puede asignar al parámetro de tipo 'Error | null'.(2345)

No quiero repetir la comprobación de tipo instanceof en el callback de batchedUpdates, ¿cuál es el enfoque correcto para manejar esta situación? Gracias.

Área de juego de TypeScript

Respuesta #1

El análisis de flujo de control no atraviesa los límites de las devoluciones de llamada. Esto se explica en el problema canónico Compensaciones en el análisis de flujo de control

Una solución alternativa es usar una variable local para congelar el tipo:

const userAPI = {
  async getById() { }
}

const batchedUpdates = (callback: () => any) => {
  callback();
}
const setError = (error: Error | null) => { }

async function main() {
  const result: { error: Error | null, data: any | null } = {
    error: null,
    data: null
  }
  try {
    const user = await userAPI.getById();
  } catch (error) {
    if (error instanceof Error) {
      result.error = error;
      const localError = error
      batchedUpdates(() => {
        setError(localError);
      })
    }
  }
}

Enlace del parque