-
-
Notifications
You must be signed in to change notification settings - Fork 679
Expand file tree
/
Copy pathunion-member.d.ts
More file actions
65 lines (48 loc) · 1.33 KB
/
union-member.d.ts
File metadata and controls
65 lines (48 loc) · 1.33 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import type {UnionToIntersection} from './union-to-intersection.d.ts';
import type {IsNever} from './is-never.d.ts';
/**
Returns an arbitrary member of a union type.
Use-cases:
- Implementing recursive type functions that accept a union type.
@example
```
import type {UnionMember, IsNever} from 'type-fest';
type UnionLength<T, Acc extends any[] = []> =
UnionMember<T> extends infer Member
? IsNever<Member> extends false
? UnionLength<Exclude<T, Member>, [...Acc, Member]>
: Acc['length']
: never;
type T1 = UnionLength<'foo' | 'bar' | 'baz'>;
//=> 3
type T2 = UnionLength<{a: string}>;
//=> 1
```
- Picking an arbitrary member from a union
@example
```
import type {UnionMember, Primitive, LiteralToPrimitive} from 'type-fest';
type IsHomogenous<T extends Primitive> = [T] extends [LiteralToPrimitive<UnionMember<T>>] ? true : false;
type T1 = IsHomogenous<1 | 2 | 3 | 4>;
//=> true
type T2 = IsHomogenous<'foo' | 'bar'>;
//=> true
type T3 = IsHomogenous<'foo' | 'bar' | 1>;
//=> false
```
Returns `never` when the input is `never`.
@example
```
import type {UnionMember} from 'type-fest';
type LastNever = UnionMember<never>;
//=> never
```
@category Type
*/
export type UnionMember<T> =
IsNever<T> extends true
? never
: UnionToIntersection<T extends any ? () => T : never> extends () => (infer R)
? R
: never;
export {};