Siguiendo esta respuesta , tengo una función que elimina elementos null de una matriz (pero no undefined ):
// JavaScript const dropNull = arr => { return arr.flatMap((f) => (f === null ? [] : f)); };Y ahora quiero usar TypeScript para definir estrictamente los tipos de entrada y salida de la función:
null Esta respuesta muestra una situación muy similar, pero opuesta a la mía: mientras que quieren permitir null pero restringir undefined , quiero restringir null y permitir undefined . Así que inspirado por la respuesta, hice el ajuste inverso:
type NonNull<T> = T extends null ? never : T[]; const dropNull = <T>(arr: T[]): NonNull<T>[] => { return arr.flatMap((f) => (f === null ? [] : f)); };Pero como muestra este REPL , aparece un error:
El tipo 'T[]' no se puede asignar al tipo 'NonNull[]'.
El tipo 'T' no se puede asignar al tipo 'NonNull'.(2322)
Investigando este error, he visto respuestas como esta , pero no pude encontrar la manera de adoptarlo en mi caso.
Es difícil para TypeScript imponer la devolución de un tipo condicional, porque es difícil saber cómo su lógica corresponde a ese tipo. Pero creo que lo está complicando demasiado y puede eludir el problema por completo.
const dropNull = <T>(arr: (T | null)[]): T[] => { return arr.flatMap((f) => (f === null ? [] : f)); }; Aquí el parámetro genérico T se infiere como un tipo que no contiene null . Y el argumento es una matriz que se puede llenar con T o null .
Luego, simplemente puede devolver valores no nulos de la matriz y TypeScript es feliz.
const numsOrNull = [1,2,null] // (number | null)[] const nums = dropNull(numsOrNull) // number[]