Skip to content

Commit 1afbac0

Browse files
committed
fix(types): undefined defaults produce optional outputs
1 parent f250109 commit 1afbac0

3 files changed

Lines changed: 22 additions & 4 deletions

File tree

src/schema.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ export default abstract class Schema<
138138
{
139139
readonly type: string;
140140

141-
declare readonly __outputType: ResolveFlags<TType, TFlags>;
141+
declare readonly __outputType: ResolveFlags<TType, TFlags, TDefault>;
142142
declare readonly __context: TContext;
143143
declare readonly __flags: TFlags;
144144
declare readonly __isYupSchema__: boolean;

src/util/types.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
export type IfAny<T, Y, N> = 0 extends 1 & T ? Y : N;
2+
13
export type Maybe<T> = T | null | undefined;
24

35
export type Preserve<T, U> = T extends U ? U : never;
@@ -35,8 +37,13 @@ export type ToggleDefault<F extends Flags, D> = Preserve<
3537
? SetFlag<F, 'd'>
3638
: UnsetFlag<F, 'd'>;
3739

38-
export type ResolveFlags<T, F extends Flags> = Preserve<F, 's'> extends never
40+
export type ResolveFlags<T, F extends Flags, D = T> = Preserve<
41+
F,
42+
's'
43+
> extends never
3944
? Extract<F, 'd'> extends never
45+
? T
46+
: D extends undefined
4047
? T
4148
: Defined<T>
4249
: never;

test/types/types.ts

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -850,6 +850,17 @@ Object: {
850850

851851
// $ExpectType null
852852
obj1.concat(obj2.default(null)).getDefault();
853+
854+
const optionalNonDefaultedObj = object({
855+
nested: object({
856+
h: number().required(),
857+
})
858+
.default(undefined)
859+
.optional(),
860+
});
861+
862+
// $ExpectType { h: number; } | undefined
863+
optionalNonDefaultedObj.cast({}).nested;
853864
}
854865

855866
SchemaOfDate: {
@@ -959,13 +970,13 @@ Object: {
959970
}
960971

961972
Conditions: {
962-
// $ExpectType StringSchema<string, AnyObject, undefined, ""> | NumberSchema<number | undefined, AnyObject, undefined, "">
973+
// $ExpectType NumberSchema<number | undefined, AnyObject, undefined, ""> | StringSchema<string, AnyObject, undefined, "">
963974
string().when('foo', ([foo], schema) => (foo ? schema.required() : number()));
964975

965976
// $ExpectType StringSchema<string | undefined, AnyObject, undefined, "">
966977
string().when('foo', ([foo], schema) => (foo ? schema.required() : schema));
967978

968-
// $ExpectType StringSchema<string, AnyObject, undefined, ""> | NumberSchema<number | undefined, AnyObject, undefined, "">
979+
// $ExpectType NumberSchema<number | undefined, AnyObject, undefined, ""> | StringSchema<string, AnyObject, undefined, "">
969980
string().when('foo', {
970981
is: true,
971982
then: () => number(),

0 commit comments

Comments
 (0)