typescript - online - null de una matriz




TypeScript filtra los nulos de una matriz (3)

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

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.


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 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[]>(...) .







typescript