Búsqueda de sitios web

javascript - ¿Cómo debería obligar a TypeScript a entender que no habrá ningún null en este arreglo?


Vengo de JavaScript y estoy aprendiendo TypeScript. Estoy acostumbrado a filtrar null de un arreglo usando .filter(x => x), sin embargo, con TypeScript me pide que defina que el arreglo puede contener null, lo cual no es cierto porque filter elimina todos los null del arreglo:

interface ILabels {
    alias: string
    publicKey: string
    lat: number
    long: number
}

const labels: ILabels[] = data.map((d) => {
  if (d.lat && d.long) {
    return {
      alias: d.alias || d.publicKey,
      publicKey: d.publicKey,
      lat: d.lat,
      long: d.long,
    };
  }
  return null;
}).filter((x) => x);

¿Cómo debería obligar a TypeScript a entender que no habrá ningún null en este arreglo? El error que me da TypeScript es:

TS2322: El tipo ''({ alias: string; publicKey: string; lat: number; long: number; } | null)[]'' no se puede asignar al tipo ''ILabels[]''. El tipo ''{ alias: string; publicKey: string; lat: number; long: number; } | null'' no se puede asignar al tipo ''ILabels''. El tipo ''null'' no se puede asignar al tipo ''ILabels'.'

Respuesta #1

Una manera es usar un guardia de tipo definido por el usuario:

function nonNull<T>(val: T | null): val is T {
  return val !== null;
}

const labels: ILabels[] = data.map((d) => {
  if (d.lat && d.long) {
    return {
      alias: d.alias || d.publicKey,
      publicKey: d.publicKey,
      lat: d.lat,
      long: d.long,
    };
  }
  return null;
}).filter(nonNull);

O, con una función de flecha:

const labels: ILabels[] = data.map((d) => {
  if (d.lat && d.long) {
    return {
      alias: d.alias || d.publicKey,
      publicKey: d.publicKey,
      lat: d.lat,
      long: d.long,
    };
  }
  return null;
}).filter(<T,>(x: T | null): x is T => x !== null);

Artículos relacionados