Skip to content

Commit 4d8a1db

Browse files
committed
Add support for exactOptionalPropertyTypes #385
1 parent 63a8965 commit 4d8a1db

29 files changed

+224
-148
lines changed

Diff for: library/CHANGELOG.md

+4
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
All notable changes to the library will be documented in this file.
44

5+
## vX.X.X (Month DD, YYYY)
6+
7+
- Add support for `exactOptionalPropertyTypes` config (issue #385)
8+
59
## v0.38.0 (August 20, 2024)
610

711
- Change `expects` and `expected` property by enclosing combined values in parentheses

Diff for: library/src/actions/partialCheck/partialCheck.test.ts

-2
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,6 @@ describe('partialCheck', () => {
211211
tuple: [123, { key: 'foo' }, 456],
212212
other: 'bar',
213213
},
214-
issues: undefined,
215214
};
216215
expect(action._run(dataset, {})).toStrictEqual(dataset);
217216
});
@@ -227,7 +226,6 @@ describe('partialCheck', () => {
227226
const dataset: TypedDataset<Input, never> = {
228227
typed: true,
229228
value: input,
230-
issues: undefined,
231229
};
232230
expect(action._run(dataset, {})).toStrictEqual({
233231
...dataset,

Diff for: library/src/actions/partialCheck/partialCheckAsync.test.ts

-2
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,6 @@ describe('partialCheckAsync', () => {
215215
tuple: [123, { key: 'foo' }, 456],
216216
other: 'bar',
217217
},
218-
issues: undefined,
219218
};
220219
expect(await action._run(dataset, {})).toStrictEqual(dataset);
221220
});
@@ -231,7 +230,6 @@ describe('partialCheckAsync', () => {
231230
const dataset: TypedDataset<Input, never> = {
232231
typed: true,
233232
value: input,
234-
issues: undefined,
235233
};
236234
expect(await action._run(dataset, {})).toStrictEqual({
237235
...dataset,

Diff for: library/src/actions/partialCheck/utils/_isPartiallyTyped/_isPartiallyTyped.test.ts

-1
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,6 @@ describe('_isPartiallyTyped', () => {
131131
const dataset: TypedDataset<Input, never> = {
132132
typed: true,
133133
value: input,
134-
issues: undefined,
135134
};
136135
expect(_isPartiallyTyped(dataset, pathList)).toBe(true);
137136
});

Diff for: library/src/actions/rawCheck/types.ts

+6-6
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,12 @@ export interface RawCheckIssue<TInput> extends BaseIssue<TInput> {
2424
* Issue info type.
2525
*/
2626
interface IssueInfo<TInput> {
27-
label?: string;
28-
input?: unknown;
29-
expected?: string;
30-
received?: string;
31-
message?: ErrorMessage<RawCheckIssue<TInput>>;
32-
path?: [IssuePathItem, ...IssuePathItem[]];
27+
label?: string | undefined;
28+
input?: unknown | undefined;
29+
expected?: string | undefined;
30+
received?: string | undefined;
31+
message?: ErrorMessage<RawCheckIssue<TInput>> | undefined;
32+
path?: [IssuePathItem, ...IssuePathItem[]] | undefined;
3333
}
3434

3535
/**

Diff for: library/src/actions/rawTransform/types.ts

+6-6
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,12 @@ export interface RawTransformIssue<TInput> extends BaseIssue<TInput> {
2424
* Issue info type.
2525
*/
2626
interface IssueInfo<TInput> {
27-
label?: string;
28-
input?: unknown;
29-
expected?: string;
30-
received?: string;
31-
message?: ErrorMessage<RawTransformIssue<TInput>>;
32-
path?: [IssuePathItem, ...IssuePathItem[]];
27+
label?: string | undefined;
28+
input?: unknown | undefined;
29+
expected?: string | undefined;
30+
received?: string | undefined;
31+
message?: ErrorMessage<RawTransformIssue<TInput>> | undefined;
32+
path?: [IssuePathItem, ...IssuePathItem[]] | undefined;
3333
}
3434

3535
/**

Diff for: library/src/methods/partial/partial.test-d.ts

+26-26
Original file line numberDiff line numberDiff line change
@@ -44,30 +44,30 @@ describe('partial', () => {
4444
describe('should infer correct types', () => {
4545
test('of input', () => {
4646
expectTypeOf<InferInput<Schema1>>().toEqualTypeOf<{
47-
key1?: string | undefined;
48-
key2?: number | undefined;
49-
key3?: string | undefined;
50-
key4?: number | null | undefined;
47+
key1?: string;
48+
key2?: number;
49+
key3?: string;
50+
key4?: number | null;
5151
}>();
5252
expectTypeOf<InferInput<Schema2>>().toEqualTypeOf<{
53-
key1?: string | undefined;
53+
key1?: string;
5454
key2: number;
55-
key3?: string | undefined;
56-
key4?: number | null | undefined;
55+
key3?: string;
56+
key4?: number | null;
5757
}>();
5858
});
5959

6060
test('of output', () => {
6161
expectTypeOf<InferOutput<Schema1>>().toEqualTypeOf<{
62-
key1?: string | undefined;
63-
key2?: number | undefined;
64-
key3?: string | undefined;
65-
key4?: number | undefined;
62+
key1?: string;
63+
key2?: number;
64+
key3?: string;
65+
key4?: number;
6666
}>();
6767
expectTypeOf<InferOutput<Schema2>>().toEqualTypeOf<{
68-
key1?: string | undefined;
68+
key1?: string;
6969
key2: number;
70-
key3?: string | undefined;
70+
key3?: string;
7171
key4: number;
7272
}>();
7373
});
@@ -105,36 +105,36 @@ describe('partial', () => {
105105
test('of input', () => {
106106
expectTypeOf<InferInput<Schema1>>().toEqualTypeOf<
107107
{
108-
key1?: string | undefined;
109-
key2?: number | undefined;
110-
key3?: string | undefined;
111-
key4?: number | null | undefined;
108+
key1?: string;
109+
key2?: number;
110+
key3?: string;
111+
key4?: number | null;
112112
} & { [key: string]: boolean }
113113
>();
114114
expectTypeOf<InferInput<Schema2>>().toEqualTypeOf<
115115
{
116116
key1: string;
117-
key2?: number | undefined;
118-
key3?: string | undefined;
119-
key4?: number | null | undefined;
117+
key2?: number;
118+
key3?: string;
119+
key4?: number | null;
120120
} & { [key: string]: boolean }
121121
>();
122122
});
123123

124124
test('of output', () => {
125125
expectTypeOf<InferOutput<Schema1>>().toEqualTypeOf<
126126
{
127-
key1?: string | undefined;
128-
key2?: number | undefined;
129-
key3?: string | undefined;
130-
key4?: number | undefined;
127+
key1?: string;
128+
key2?: number;
129+
key3?: string;
130+
key4?: number;
131131
} & { [key: string]: boolean }
132132
>();
133133
expectTypeOf<InferOutput<Schema2>>().toEqualTypeOf<
134134
{
135135
key1: string;
136-
key2?: number | undefined;
137-
key3?: string | undefined;
136+
key2?: number;
137+
key3?: string;
138138
key4: number;
139139
} & { [key: string]: boolean }
140140
>();

Diff for: library/src/methods/partial/partialAsync.test-d.ts

+26-26
Original file line numberDiff line numberDiff line change
@@ -44,30 +44,30 @@ describe('partialAsync', () => {
4444
describe('should infer correct types', () => {
4545
test('of input', () => {
4646
expectTypeOf<InferInput<Schema1>>().toEqualTypeOf<{
47-
key1?: string | undefined;
48-
key2?: number | undefined;
49-
key3?: string | undefined;
50-
key4?: number | null | undefined;
47+
key1?: string;
48+
key2?: number;
49+
key3?: string;
50+
key4?: number | null;
5151
}>();
5252
expectTypeOf<InferInput<Schema2>>().toEqualTypeOf<{
53-
key1?: string | undefined;
53+
key1?: string;
5454
key2: number;
55-
key3?: string | undefined;
56-
key4?: number | null | undefined;
55+
key3?: string;
56+
key4?: number | null;
5757
}>();
5858
});
5959

6060
test('of output', () => {
6161
expectTypeOf<InferOutput<Schema1>>().toEqualTypeOf<{
62-
key1?: string | undefined;
63-
key2?: number | undefined;
64-
key3?: string | undefined;
65-
key4?: number | undefined;
62+
key1?: string;
63+
key2?: number;
64+
key3?: string;
65+
key4?: number;
6666
}>();
6767
expectTypeOf<InferOutput<Schema2>>().toEqualTypeOf<{
68-
key1?: string | undefined;
68+
key1?: string;
6969
key2: number;
70-
key3?: string | undefined;
70+
key3?: string;
7171
key4: number;
7272
}>();
7373
});
@@ -105,36 +105,36 @@ describe('partialAsync', () => {
105105
test('of input', () => {
106106
expectTypeOf<InferInput<Schema1>>().toEqualTypeOf<
107107
{
108-
key1?: string | undefined;
109-
key2?: number | undefined;
110-
key3?: string | undefined;
111-
key4?: number | null | undefined;
108+
key1?: string;
109+
key2?: number;
110+
key3?: string;
111+
key4?: number | null;
112112
} & { [key: string]: boolean }
113113
>();
114114
expectTypeOf<InferInput<Schema2>>().toEqualTypeOf<
115115
{
116116
key1: string;
117-
key2?: number | undefined;
118-
key3?: string | undefined;
119-
key4?: number | null | undefined;
117+
key2?: number;
118+
key3?: string;
119+
key4?: number | null;
120120
} & { [key: string]: boolean }
121121
>();
122122
});
123123

124124
test('of output', () => {
125125
expectTypeOf<InferOutput<Schema1>>().toEqualTypeOf<
126126
{
127-
key1?: string | undefined;
128-
key2?: number | undefined;
129-
key3?: string | undefined;
130-
key4?: number | undefined;
127+
key1?: string;
128+
key2?: number;
129+
key3?: string;
130+
key4?: number;
131131
} & { [key: string]: boolean }
132132
>();
133133
expectTypeOf<InferOutput<Schema2>>().toEqualTypeOf<
134134
{
135135
key1: string;
136-
key2?: number | undefined;
137-
key3?: string | undefined;
136+
key2?: number;
137+
key3?: string;
138138
key4: number;
139139
} & { [key: string]: boolean }
140140
>();

Diff for: library/src/methods/required/required.test-d.ts

+6-6
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,9 @@ describe('required', () => {
5555
}>();
5656
expectTypeOf<InferInput<Schema2>>().toEqualTypeOf<{
5757
key1: string;
58-
key2?: number | undefined;
58+
key2?: number;
5959
key3: string;
60-
key4?: number | null | undefined;
60+
key4?: number | null;
6161
}>();
6262
});
6363

@@ -70,7 +70,7 @@ describe('required', () => {
7070
}>();
7171
expectTypeOf<InferOutput<Schema2>>().toEqualTypeOf<{
7272
key1: string;
73-
key2?: number | undefined;
73+
key2?: number;
7474
key3: string;
7575
key4: number;
7676
}>();
@@ -119,10 +119,10 @@ describe('required', () => {
119119
>();
120120
expectTypeOf<InferInput<Schema2>>().toEqualTypeOf<
121121
{
122-
key1?: string | undefined;
122+
key1?: string;
123123
key2: number;
124124
key3: string;
125-
key4?: number | null | undefined;
125+
key4?: number | null;
126126
} & { [key: string]: boolean }
127127
>();
128128
});
@@ -138,7 +138,7 @@ describe('required', () => {
138138
>();
139139
expectTypeOf<InferOutput<Schema2>>().toEqualTypeOf<
140140
{
141-
key1?: string | undefined;
141+
key1?: string;
142142
key2: number;
143143
key3: string;
144144
key4: number;

Diff for: library/src/methods/required/requiredAsync.test-d.ts

+6-6
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,9 @@ describe('requiredAsync', () => {
6363
}>();
6464
expectTypeOf<InferInput<Schema2>>().toEqualTypeOf<{
6565
key1: string;
66-
key2?: number | undefined;
66+
key2?: number;
6767
key3: string;
68-
key4?: number | null | undefined;
68+
key4?: number | null;
6969
}>();
7070
});
7171

@@ -78,7 +78,7 @@ describe('requiredAsync', () => {
7878
}>();
7979
expectTypeOf<InferOutput<Schema2>>().toEqualTypeOf<{
8080
key1: string;
81-
key2?: number | undefined;
81+
key2?: number;
8282
key3: string;
8383
key4: number;
8484
}>();
@@ -131,10 +131,10 @@ describe('requiredAsync', () => {
131131
>();
132132
expectTypeOf<InferInput<Schema2>>().toEqualTypeOf<
133133
{
134-
key1?: string | undefined;
134+
key1?: string;
135135
key2: number;
136136
key3: string;
137-
key4?: number | null | undefined;
137+
key4?: number | null;
138138
} & { [key: string]: boolean }
139139
>();
140140
});
@@ -150,7 +150,7 @@ describe('requiredAsync', () => {
150150
>();
151151
expectTypeOf<InferOutput<Schema2>>().toEqualTypeOf<
152152
{
153-
key1?: string | undefined;
153+
key1?: string;
154154
key2: number;
155155
key3: string;
156156
key4: number;

Diff for: library/src/schemas/looseObject/looseObject.test-d.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,8 @@ describe('looseObject', () => {
5454
expectTypeOf<InferInput<Schema>>().toEqualTypeOf<
5555
{
5656
key1: string;
57-
key2?: string | undefined;
58-
key3?: string | null | undefined;
57+
key2?: string;
58+
key3?: string | null;
5959
key4: { key: number };
6060
key5: string;
6161
} & { [key: string]: unknown }
@@ -67,7 +67,7 @@ describe('looseObject', () => {
6767
{
6868
key1: string;
6969
key2: string;
70-
key3?: string | null | undefined;
70+
key3?: string | null;
7171
key4: { key: number };
7272
readonly key5: string;
7373
} & { [key: string]: unknown }

Diff for: library/src/schemas/looseObject/looseObject.test.ts

+2
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ describe('looseObject', () => {
134134
test('for optional entry', () => {
135135
expectNoSchemaIssue(looseObject({ key: optional(string()) }), [
136136
{},
137+
// @ts-expect-error
137138
{ key: undefined },
138139
{ key: 'foo' },
139140
]);
@@ -142,6 +143,7 @@ describe('looseObject', () => {
142143
test('for nullish entry', () => {
143144
expectNoSchemaIssue(looseObject({ key: nullish(number()) }), [
144145
{},
146+
// @ts-expect-error
145147
{ key: undefined },
146148
{ key: null },
147149
{ key: 123 },

0 commit comments

Comments
 (0)