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);
