-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtypes.test-d.ts
125 lines (101 loc) · 2.33 KB
/
types.test-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
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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
/* eslint-disable id-length */
import {expectAssignable, expectNotAssignable} from 'tsd';
import {DeepOmitOptional} from '../build/ts/types';
interface Simple {
req: string;
opt?: string;
}
expectAssignable<DeepOmitOptional<Simple>>({
req: '',
});
expectNotAssignable<DeepOmitOptional<Simple>>({});
interface Nested {
req: Simple;
opt?: Simple;
}
expectAssignable<DeepOmitOptional<Nested>>({
req: {req: ''},
});
expectNotAssignable<DeepOmitOptional<Nested>>({
opt: {opt: '', req: ''},
req: {opt: '', req: ''},
});
interface Complex {
union: string | number;
nullUnion: string | null;
unefUnion: string | undefined;
listUnion: (string | number)[];
intersect: {a: string; b?: string} & {c: string; d?: string};
intersectingUnion: {a: string | null} & {a: string | number};
}
const complex: DeepOmitOptional<Complex> = {
union: '',
nullUnion: null,
unefUnion: undefined,
listUnion: [2, ''],
intersect: {a: '', c: ''},
intersectingUnion: {a: ''},
};
expectAssignable<DeepOmitOptional<Complex>>(complex);
expectNotAssignable<DeepOmitOptional<Complex>>({
...complex,
intersectingUnion: {a: null},
});
expectNotAssignable<DeepOmitOptional<Complex>>({
...complex,
intersect: {a: '', b: '', c: '', d: ''},
});
interface NestedComplex {
req: Complex;
opt?: Complex;
}
expectAssignable<DeepOmitOptional<NestedComplex>>({
req: complex,
});
expectNotAssignable<DeepOmitOptional<NestedComplex>>({
req: complex,
opt: complex,
});
interface SimpleList {
req: Simple[];
opt?: Simple[];
}
expectAssignable<DeepOmitOptional<SimpleList>>({
req: [{req: ''}],
});
expectNotAssignable<DeepOmitOptional<SimpleList>>({
req: [{req: '', opt: ''}],
opt: [{req: '', opt: ''}],
});
interface ReadOnlyList {
req: ReadonlyArray<Simple>;
opt?: ReadonlyArray<Simple>;
}
expectAssignable<DeepOmitOptional<ReadOnlyList>>({
req: [{req: ''}],
});
expectNotAssignable<DeepOmitOptional<ReadOnlyList>>({
req: [{req: '', opt: ''}],
opt: [{req: '', opt: ''}],
});
interface ComplexList {
req: Complex[];
opt?: Complex[];
nest: {
req: Complex[];
opt?: Complex[];
};
}
expectAssignable<DeepOmitOptional<ComplexList>>({
req: [complex],
nest: {
req: [complex],
},
});
expectNotAssignable<DeepOmitOptional<ComplexList>>({
req: [complex],
opt: [],
nest: {
req: [complex],
opt: [complex],
},