javascript - ¿Abreviatura para crear condicionalmente un array a partir de un valor opcional?
Tengo una función que opcionalmente acepta un array. Tengo otras variables que pueden ser undefined, pero si están definidas me gustaría crear un array a partir de ellas:
function test(array?: string[]) {
console.log(array);
}
let value: string | undefined;
value = 'abc';
const temp = value ? [value] : undefined; // Shorthand?
test(temp)
¿Existe una forma abreviada de crear la variable temp con un arreglo de strings o pasar undefined? Intenté hacer lo siguiente pero no lo logré:
// If value is 1, true, or 'some string' it will take that value not the array
const temp = value && [value];
// Passes back an empty array if value is undefined
const temp = [value].filter(Boolean),
Respuesta #1
Como se señaló en los comentarios, simplemente crea una función auxiliar para esto:
const arrOrUndef = <T,>(val: T | undefined): T[] | undefined => val !== undefined ? [val] : undefined;
Entonces solo usa:
let value: string | undefined = 'abc';
test(arrOrUndef(value))
Enlace del Playground de TS
Además, gracias a pilchard en los comentarios por señalar que es mejor usar un genérico, en lugar de solo el tipo string en tu pregunta o el tipo any. También, gracias a JDB por señalar que debes usar !== undefined, en lugar de simplemente verificar un valor falso (como lo hace la pregunta original).
Respuesta #2
Parece que estás buscando algo como lo opuesto al operador de fusión nula (??): en lugar de evaluar la segunda parte si la primera expresión es undefined, quieres que se evalúe la segunda parte si la primera no es undefined.
A la fecha de esta publicación, no existe un operador ("atajo") como ese. Lo mejor es una función auxiliar o un operador ternario (como ya sabes).
Aquí hay un ejemplo que también funciona con valores falsos como 0:
const makeArray = <T>(value: T|undefined): T[]|undefined =>
value === undefined ? undefined : [value];
makeArray(undefined); // undefined
makeArray(null); // [null]
makeArray("foo"); // ["foo"]
makeArray(false); // [false]
makeArray(0); // [0]
