UNPKG

1.12 kBTypeScriptView Raw
1import type {IsNever} from './is-never';
2import type {UnionToIntersection} from './union-to-intersection';
3
4/**
5Returns the last element of a union type.
6
7@example
8```
9type Last = LastOfUnion<1 | 2 | 3>;
10//=> 3
11```
12*/
13type LastOfUnion<T> =
14UnionToIntersection<T extends any ? () => T : never> extends () => (infer R)
15 ? R
16 : never;
17
18/**
19Convert a union type into an unordered tuple type of its elements.
20
21This can be useful when you have objects with a finite set of keys and want a type defining only the allowed keys, but do not want to repeat yourself.
22
23@example
24```
25import type {UnionToTuple} from 'type-fest';
26
27type Numbers = 1 | 2 | 3;
28type NumbersTuple = UnionToTuple<Numbers>;
29//=> [1, 2, 3]
30```
31
32@example
33```
34import type {UnionToTuple} from 'type-fest';
35
36const pets = {
37 dog: '🐶',
38 cat: '🐱',
39 snake: '🐍',
40};
41
42type Pet = keyof typeof pets;
43//=> 'dog' | 'cat' | 'snake'
44
45const petList = Object.keys(pets) as UnionToTuple<Pet>;
46//=> ['dog', 'cat', 'snake']
47```
48
49@category Array
50*/
51export type UnionToTuple<T, L = LastOfUnion<T>> =
52IsNever<T> extends false
53 ? [...UnionToTuple<Exclude<T, L>>, L]
54 : [];