una online nulo nulidad matriz lineal espacio array typescript

typescript - online - nulidad de una matriz



TypeScript filtra los nulos de una matriz (4)

TypeScript, --strictNullChecks mode.

Supongamos que tengo una matriz de cadenas anulables (cadena | nula) []. ¿Cuál sería una forma de expresión única para eliminar todos los nulos de tal manera que el resultado tenga el tipo de cadena []?

const array: (string | null)[] = ["foo", "bar", null, "zoo", null]; const filterdArray: string[] = ???;

Array.filter no funciona aquí:

// Type ''(string | null)[]'' is not assignable to type ''string[]'' array.filter(x => x != null);

Las comprensiones de arrays podrían haber funcionado, pero no son compatibles con TypeScript.

En realidad, la pregunta se puede generalizar al problema de filtrar una matriz de cualquier tipo de unión mediante la eliminación de las entradas que tienen un tipo particular de la unión. Pero concentrémonos en uniones con nulos y quizás indefinidos, ya que estos son los casos de uso más comunes.


Al igual que en la respuesta de @ bijou-trouvaille, solo necesita declarar que <arg> is <Type> como la salida de la función de filtro:

array.filter((x): x is MyType => x !== null);


Creo que lo tiene todo bien, excepto que la comprobación de tipo solo hace que el tipo filtrado no sea diferente al tipo de retorno.

const array: (string | null)[] = ["foo", "bar", null, "zoo", null]; const filterdArray: string[] = array.filter(f => f !== undefined && f !== null) as any; console.log(filterdArray);


Puede convertir el resultado de su filter en el tipo que desee:

const array: (string | null)[] = ["foo", "bar", null, "zoo", null]; const filterdArray = array.filter(x => x != null) as string[];

Esto funciona para el caso de uso más general que mencionó, por ejemplo:

const array2: (string | number)[] = ["str1", 1, "str2", 2]; const onlyStrings = array2.filter(x => typeof x === "string") as string[]; const onlyNumbers = array2.filter(x => typeof x === "number") as number[];

( codigo en patio de juegos )


Puede usar una función de predicado de tipo en el .filter para evitar la .filter de la comprobación de tipo estricta:

function notEmpty<TValue>(value: TValue | null | undefined): value is TValue { return value !== null && value !== undefined; } const array: (string | null)[] = [''foo'', ''bar'', null, ''zoo'', null]; const filteredArray: string[] = array.filter(notEmpty);

Alternativamente, puede usar array.reduce<string[]>(...) .