-
-
Notifications
You must be signed in to change notification settings - Fork 532
/
distributed-omit.ts
77 lines (60 loc) · 1.71 KB
/
distributed-omit.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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
import {expectType, expectError} from 'tsd';
import type {DistributedOmit, Except} from '../index';
// When passing a non-union type, and
// omitting keys that are present in the type.
// It behaves exactly like `Except`.
type Example1 = {
a: number;
b: string;
};
type Actual1 = DistributedOmit<Example1, 'a'>;
type Actual2 = DistributedOmit<Example1, 'b'>;
type Actual3 = DistributedOmit<Example1, 'a' | 'b'>;
type Expected1 = Except<Example1, 'a'>;
type Expected2 = Except<Example1, 'b'>;
type Expected3 = Except<Example1, 'a' | 'b'>;
declare const expected1: Expected1;
declare const expected2: Expected2;
declare const expected3: Expected3;
expectType<Actual1>(expected1);
expectType<Actual2>(expected2);
expectType<Actual3>(expected3);
// When passing a non-union type, and
// omitting keys that are NOT present in the type.
// It behaves exactly like `Except`, by not letting you
// omit keys that are not present in the type.
type Example2 = {
a: number;
b: string;
};
expectError(() => {
type Actual4 = DistributedOmit<Example2, 'c'>;
});
// When passing a union type, and
// omitting keys that are present in some union members.
// It lets you omit keys that are present in some union members,
// and distributes over the union.
type A = {
discriminant: 'A';
foo: string;
a: number;
};
type B = {
discriminant: 'B';
foo: string;
bar: string;
b: string;
};
type C = {
discriminant: 'C';
bar: string;
c: boolean;
};
type Union = A | B | C;
type OmittedUnion = DistributedOmit<Union, 'foo' | 'bar'>;
declare const omittedUnion: OmittedUnion;
if (omittedUnion.discriminant === 'A') {
expectType<{discriminant: 'A'; a: number}>(omittedUnion);
expectError(omittedUnion.foo);
expectError(omittedUnion.bar);
}