-
-
Notifications
You must be signed in to change notification settings - Fork 532
/
tagged-union.d.ts
51 lines (45 loc) · 1.26 KB
/
tagged-union.d.ts
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
/**
Create a union of types that share a common discriminant property.
Use-case: A shorter way to declare tagged unions with multiple members.
@example
```
import type {TaggedUnion} from 'type-fest';
type Tagged<Fields extends Record<string, unknown> = TaggedUnion<'type', Fields>
// The TaggedUnion utility reduces the amount of boilerplate needed to create a tagged union with multiple members, making the code more concise.
type EventMessage = Tagged<{
OpenExternalUrl: {
url: string;
id: number;
language: string;
};
ToggleBackButtonVisibility: {
visible: boolean;
};
PurchaseButtonPressed: {
price: number;
time: Date;
};
NavigationStateChanged: {
navigation?: string;
};
}>;
// Here is the same type created without this utility.
type EventMessage =
| {
type: 'OpenExternalUrl';
url: string;
id: number;
language: string;
}
| {type: 'ToggleBackButtonVisibility'; visible: boolean}
| {type: 'PurchaseButtonPressed'; price: number; time: Date}
| {type: 'NavigationStateChanged'; navigation?: string};
```
@category Utilities
*/
export type TaggedUnion<
TagKey extends string,
UnionMembers extends Record<string, Record<string, unknown>>,
> = {
[Name in keyof UnionMembers]: {[Key in TagKey]: Name} & UnionMembers[Name];
}[keyof UnionMembers];