javascript - Kortform för att villkorligt skapa en array från ett valfritt värde?
Jag har en funktion som valfritt tar emot en array. Jag har andra variabler som kan vara undefined, men om de är definierade vill jag skapa en array från dem:
function test(array?: string[]) {
console.log(array);
}
let value: string | undefined;
value = 'abc';
const temp = value ? [value] : undefined; // Shorthand?
test(temp)
Finns det ett kortkommandosätt att skapa temp-variabeln med en array av strings eller skicka undefined? Jag försökte göra följande men uppnådde det inte:
// 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),
Svar #1
Som det påpekades i kommentarerna, skapa bara en hjälpfunktion för detta:
const arrOrUndef = <T,>(val: T | undefined): T[] | undefined => val !== undefined ? [val] : undefined;
Använd då bara:
let value: string | undefined = 'abc';
test(arrOrUndef(value))
TS Playground-länk
Tack också till pilchard i kommentarerna för att ha påpekat att det är bättre att använda en generisk typ, snarare än bara string-typen i din fråga eller any-typen. Tack också till JDB för att ha påpekat att du måste använda !== undefined, istället för att bara kontrollera ett falskt värde (som den ursprungliga frågan gör).
Svar #2
Det låter som att du letar efter något som motsatsen till nullish coalescing-operatorn (??): istället för att utvärdera den andra delen om det första uttrycket är undefined, vill du att den ska utvärdera den andra delen om det första inte är undefined.
Från och med datumet för detta inlägg finns det ingen operator ("kortform") som den. Ditt bästa alternativ är en hjälpfunktion eller en ternär operator (som du redan är medveten om).
Här är ett exempel som också fungerar med falska värden som 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]
