-
-
Notifications
You must be signed in to change notification settings - Fork 508
/
conditional-pick-deep.ts
113 lines (95 loc) · 3.05 KB
/
conditional-pick-deep.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
import {expectType} from 'tsd';
import type {ConditionalPickDeep} from '../index';
declare class ClassA {
public a: string;
}
type Example = {
optional?: boolean;
literal: 'foo';
string: string;
map: Map<string, string>;
set: Set<string>;
date: Date;
array: string[];
tuples: ['foo', 'bar'];
instanceA: ClassA;
ClassA: typeof ClassA;
function: (...args: string[]) => string;
stringOrBoolean: string | boolean;
object: {
string: string;
subObject: {
optional?: string;
string: string;
};
};
};
declare const stringPick: ConditionalPickDeep<Example, string>;
expectType<{
literal: 'foo';
string: string;
object: {
string: string;
subObject: {
string: string;
};
};
}>(stringPick);
declare const stringEqualityPick: ConditionalPickDeep<Example, string, {condition: 'equality'}>;
expectType<{
string: string;
object: {
string: string;
subObject: {
string: string;
};
};
}>(stringEqualityPick);
declare const stringPickOptional: ConditionalPickDeep<Example, string | undefined>;
expectType<{
literal: 'foo';
string: string;
object: {
string: string;
subObject: {
optional?: string | undefined;
string: string;
};
};
}>(stringPickOptional);
declare const stringPickOptionalOnly: ConditionalPickDeep<Example, string | undefined, {condition: 'equality'}>;
expectType<{object: {subObject: {optional?: string | undefined}}}>(stringPickOptionalOnly);
declare const booleanPick: ConditionalPickDeep<Example, boolean | undefined>;
expectType<{optional?: boolean | undefined}>(booleanPick);
declare const numberPick: ConditionalPickDeep<Example, number>;
expectType<{}>(numberPick);
declare const stringOrBooleanPick: ConditionalPickDeep<Example, string | boolean>;
expectType<{
literal: 'foo';
string: string;
stringOrBoolean: string | boolean;
object: {
string: string;
subObject: {
string: string;
};
};
}>(stringOrBooleanPick);
declare const stringOrBooleanPickOnly: ConditionalPickDeep<Example, string | boolean, {condition: 'equality'}>;
expectType<{stringOrBoolean: string | boolean}>(stringOrBooleanPickOnly);
declare const arrayPick: ConditionalPickDeep<Example, string[]>;
expectType<{array: string[]; tuples: ['foo', 'bar']}>(arrayPick);
declare const arrayEqualityPick: ConditionalPickDeep<Example, string[], {condition: 'equality'}>;
expectType<{array: string[]}>(arrayEqualityPick);
declare const tuplePick: ConditionalPickDeep<Example, ['foo', 'bar']>;
expectType<{tuples: ['foo', 'bar']}>(tuplePick);
declare const instancePick: ConditionalPickDeep<Example, ClassA>;
expectType<{instanceA: ClassA}>(instancePick);
declare const classPick: ConditionalPickDeep<Example, typeof ClassA>;
expectType<{ClassA: typeof ClassA}>(classPick);
declare const functionPick: ConditionalPickDeep<Example, (...args: string[]) => string>;
expectType<{function: (...args: string[]) => string}>(functionPick);
declare const mapPick: ConditionalPickDeep<Example, Map<string, string>>;
expectType<{map: Map<string, string>}>(mapPick);
declare const setPick: ConditionalPickDeep<Example, Set<string>>;
expectType<{set: Set<string>}>(setPick);