Búsqueda de sitios web

javascript - inferencia de arrays en typescript con Promise.allSettled


Quiero que Typescript infiera tipos en un array filtrado.

Estoy filtrando mis resultados según el estado "rechazado" o "cumplido" (de Promise.allSettled).

Por alguna razón, Typescript no está infiriendo los resultados de mi filtrado.
Aquí hay un ejemplo mínimo de lo que estoy tratando de lograr:

type FullFilledResults = {
  status: 'fullfilled';
  value: any;
}

type RejectResults = {
  status: 'rejected';
  reason: string;
}

type Results = RejectResults | FullFilledResults

const results: Results[] = [{
  status: 'rejected',
  reason: 'err'
}, {
  status: 'fullfilled',
  value: {}
}]

// Type infer Results[] but I want FullFilledResults[]
const fullfilledResults = results.filter(v => v.status === 'fullfilled')

// Type infer Results[] but I want RejectedResults[]
const rejectedResults = results.filter(v => v.status === 'rejected')

Respuesta #1

La siguiente función es genérica para cualquier PromiseSettled

function assertFulfilled<T>(item: PromiseSettledResult<T>): item is PromiseFulfilledResult<T> {
   return item.status === 'fulfilled';
}

Respuesta #2

Puedes usar predicados de tipo para este propósito

function assertFullfilled(item: Results): item is FullFilledResults {
    return item.status === 'fullfilled';
}

const fullfilledResults = results.filter(assertFullfilled); // FullFilledResults[]

Artículos relacionados