Skapa union av unika array-element från union av typer (typescript)
Jag skulle vilja fråga, är det möjligt att deklarera en array av unika typer från en union av dessa typer?
Jag har denna typ Value:
type Value = string | number
Sedan skapade jag typen Values så här:
type Values = Value[]
men det skapar en typ:
type Values = (string|number)[]
men hur kan jag uppnå detta från typen Value?
type Values = string[] | number[]
För att i princip har jag en funktion som renderar checkbox-ar för tabellfilter. Den checkbox kommer alltid ha antingen string eller number som värde.
Sedan, när du klickar på en kryssruta, lägger det till det värdet i en array. Till exempel, du har en kolumn firstName och du lägger till två namn i det filtret. Det blir då en array av string eller array av number: string[] | number[] vilket skulle representera min typ Values.
Så finns det ett sätt att skapa typen Values från typen Value?
Jag skapade denna exempel-sandlåda bara för att jämföra de typerna.
Tack för alla bidrag!
Svar #1
Dessa lösningar är inte tillfredsställande för mig. I det första fallet måste jag uttryckligen nämna vilken typ av element jag förväntar mig i arrayen. I det andra fallet måste jag uppräkna alla arraytyper jag är intresserad av (vilket jag försöker undvika från början! Dessutom har jag unionstypen, jag vill ha arraytyperna - det är inte en fråga om preferens)
Hur som helst, efter att ha lekt lite kom jag på ett sätt att få det att fungera. Sedan gick jag tillbaka till dokumentationen och insåg att de faktiskt använder just detta problem som ett exempel...
type ValueTypes = string | number
type ToArray<Type> = Type extends any ? Type[] : never;
const a1: ToArray<ValueTypes> = ['a','b'] // okay
const a2: ToArray<ValueTypes> = [1, 2] // okay
const a3: ToArray<ValueTypes> = ['a', 2] // error (i.e. success)
Svar #2
Jag skulle välja begränsad templating
type Values<T extends string | number> = T[];
const myArr: Values<string> = [
'foo',
'bar',
];
const myArr2: Values<number> = [
1,
2,
];
Eller använd överbelastade typer (låt TypeScript avgöra typen beroende på vad som finns i arrayen)
type ValueTypeA = string[];
type ValueTypeB = number[];
type Values = ValueTypeA | ValueTypeB;
const myArr: Values = [
'foo',
'bar',
];
const myArr2: Values = [
1,
2,
];
