UPDATE Februar 2019
In TypeScript 3.4, das im März 2019 veröffentlicht werden soll, kann der Compiler angewiesen werden, den Typ eines Tupels von Literalen als Tupel von Literalen abzuleiten , anstatt beispielsweise string[]die as constSyntax zu verwenden . Diese Art der Behauptung führt dazu, dass der Compiler den engstmöglichen Typ für einen Wert ableitet, einschließlich der Erstellung aller Elemente readonly. Es sollte so aussehen:
const list = ['a', 'b', 'c'] as const;
type NeededUnionType = typeof list[number];
Dadurch entfällt die Notwendigkeit einer Hilfsfunktion jeglicher Art. Nochmals viel Glück an alle!
UPDATE Juli 2018
Es sieht so aus, als ob TypeScript ab TypeScript 3.0 automatisch auf Tupeltypen schließen kann . Nach der Freigabe kann die von tuple()Ihnen benötigte Funktion kurz und bündig geschrieben werden als:
export type Lit = string | number | boolean | undefined | null | void | {};
export const tuple = <T extends Lit[]>(...args: T) => args;
Und dann können Sie es so verwenden:
const list = tuple('a','b','c');
type NeededUnionType = typeof list[number];
Hoffe das funktioniert für Menschen!
UPDATE Dezember 2017
Seit ich diese Antwort gepostet habe, habe ich einen Weg gefunden, Tupeltypen abzuleiten, wenn Sie bereit sind, Ihrer Bibliothek eine Funktion hinzuzufügen. Überprüfen Sie die Funktion tuple()in tuple.ts . Mit ihm können Sie Folgendes schreiben und sich nicht wiederholen:
const list = tuple('a','b','c');
type NeededUnionType = typeof list[number];
Viel Glück!
ORIGINAL Juli 2017
Ein Problem ist, dass das Literal ['a','b','c']als Typ abgeleitet wird string[], sodass das Typsystem die spezifischen Werte vergisst. Sie können das Typsystem zwingen, sich jeden Wert als Literalzeichenfolge zu merken:
const list = ['a' as 'a','b' as 'b','c' as 'c'];
Oder interpretieren Sie die Liste besser als Tupeltyp:
const list: ['a','b','c'] = ['a','b','c'];
Dies ist eine ärgerliche Wiederholung, führt aber zur Laufzeit zumindest kein fremdes Objekt ein.
Jetzt können Sie Ihre Gewerkschaft so bekommen:
type NeededUnionType = typeof list[number];
Hoffentlich hilft das.