AKTUALIZACJA luty 2019 r
W języku TypeScript 3.4, który powinien zostać wydany w marcu 2019 r ., Będzie można poinstruować kompilator, aby wywnioskował typ krotki literałów jako krotkę literałów , zamiast, jak powiedzmy, string[]użyć as constskładni . Ten typ asercji powoduje, że kompilator wywnioskuje najwęższy możliwy typ wartości, w tym tworzenie wszystkiego readonly. To powinno wyglądać tak:
const list = ['a', 'b', 'c'] as const;
type NeededUnionType = typeof list[number];
Pozwoli to wyeliminować potrzebę jakiejkolwiek funkcji pomocniczej. Powodzenia znowu wszystkim!
UPDATE lipiec 2018
Wygląda na to, że począwszy od TypeScript 3.0, TypeScript będzie mógł automatycznie wywnioskować typy krotek . Po zwolnieniu tuple()funkcję, której potrzebujesz, można zwięźle zapisać jako:
export type Lit = string | number | boolean | undefined | null | void | {};
export const tuple = <T extends Lit[]>(...args: T) => args;
A potem możesz go używać w ten sposób:
const list = tuple('a','b','c');
type NeededUnionType = typeof list[number];
Mam nadzieję, że to działa dla ludzi!
UPDATE grudzień 2017
Odkąd opublikowałem tę odpowiedź, znalazłem sposób na wywnioskowanie typów krotek, jeśli chcesz dodać funkcję do swojej biblioteki. Sprawdź funkcję tuple()w tuple.ts . Używając go, jesteś w stanie napisać następujące rzeczy i nie powtarzać się:
const list = tuple('a','b','c');
type NeededUnionType = typeof list[number];
Powodzenia!
ORYGINALNY lipiec 2017
Jednym z problemów jest to, że literał ['a','b','c']zostanie wywnioskowany jako typ string[], więc system typów zapomni o określonych wartościach. Możesz wymusić na systemie typów zapamiętanie każdej wartości jako literału:
const list = ['a' as 'a','b' as 'b','c' as 'c'];
A może lepiej zinterpretować listę jako typ krotki:
const list: ['a','b','c'] = ['a','b','c'];
Jest to irytujące powtarzanie, ale przynajmniej nie wprowadza obcego obiektu w czasie wykonywania.
Teraz możesz otrzymać swój związek w następujący sposób:
type NeededUnionType = typeof list[number];
Mam nadzieję, że to pomoże.