Tengo una matriz de number | undefined s y quiero el máximo de esta matriz, si alguno de ellos es un número. Para hacerlo, quiero filtrar el elemento que es de tipo número, de modo que pueda pasar una matriz de solo números a Math.max(...array)
(Sé que no debería Math.max en una matriz vacía desestructurada, por lo que solo haré un math.max si hay 1 o más valores numéricos en la matriz)
const numbersArray: number[] = [a,b].filter((v) => typeof v === "number"); Eso funciona bien en tiempo de ejecución, pero aparece un error mecanografiado que dice que no puedo afirmar que numbersArray sea del tipo number[].
Type 'undefined[]' is not assignable to type 'number[]'. Type 'undefined' is not assignable to type 'number'.ts(2322)¿Qué estoy haciendo mal aquí?
Desafortunadamente, el mecanografiado no entiende el filter por alguna razón.
La solución habitual sería hacer un encasillado
const numbersArray: number[] = [1, undefined, 3].filter((v): v is number => typeof v === "number"); Sin embargo, por alguna razón, TypeScript entiende flatMap , por lo que puede usarlo como alternativa. Solo tenga en cuenta que IE no lo admite de forma nativa, por lo que debe transferirse si desea admitirlo.
const numbersArray: number[] = [1, undefined, 3].flatMap(v => typeof v === "number" ? [v] : []);Puedes usar el método de reducción:
const myArray: number|undefined[] = [] let filteredArray: number[] = [] filteredArray = myArray.reduce<number[]>((previous, current) => current ? [...previous, current] : previous, [])