Erstellen Sie eine Union-Typ-Annotation aus einem dynamisch generierten Array in Typescript
Wenn man ein aus einer Reduce-Funktion erzeugtes Array hat, wie ist es möglich, aus diesem Array einen Union-Typ zu erstellen?
import someFancyObject from 'some/modules';
const generatedArray = someFancyObject.reduce((acc, val, i) => {...}, []);
// generatedArray would be like: ['a', 'b', 'c']
type UnionFromArray = ???
// UnionFromArray would be like 'a' | 'b' | 'c'
Antwort #1
Sie können entweder ein Array aus dem Funktionsargument ableiten oder ein konstantes (unveränderliches) Array deklarieren:
const arr = ['a', 'b', 'c'] as const
type UnionFromArray = (typeof arr)[number] // "a" | "b" | "c"
// OR
const unionFromArray = <
T extends string,
Arr extends T[]
>(arr: [...Arr]): Arr[number] => null as any
const result = unionFromArray(['a', 'b', 'c']) // // "a" | "b" | "c"
