Búsqueda de sitios web

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]