Skip to content

Commit

Permalink
fix(types): undefined defaults produce optional outputs
Browse files Browse the repository at this point in the history
  • Loading branch information
jquense committed Aug 23, 2022
1 parent f250109 commit 1afbac0
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 4 deletions.
2 changes: 1 addition & 1 deletion src/schema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,7 @@ export default abstract class Schema<
{
readonly type: string;

declare readonly __outputType: ResolveFlags<TType, TFlags>;
declare readonly __outputType: ResolveFlags<TType, TFlags, TDefault>;
declare readonly __context: TContext;
declare readonly __flags: TFlags;
declare readonly __isYupSchema__: boolean;
Expand Down
9 changes: 8 additions & 1 deletion src/util/types.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
export type IfAny<T, Y, N> = 0 extends 1 & T ? Y : N;

export type Maybe<T> = T | null | undefined;

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

export type ResolveFlags<T, F extends Flags> = Preserve<F, 's'> extends never
export type ResolveFlags<T, F extends Flags, D = T> = Preserve<
F,
's'
> extends never
? Extract<F, 'd'> extends never
? T
: D extends undefined
? T
: Defined<T>
: never;
Expand Down
15 changes: 13 additions & 2 deletions test/types/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -850,6 +850,17 @@ Object: {

// $ExpectType null
obj1.concat(obj2.default(null)).getDefault();

const optionalNonDefaultedObj = object({
nested: object({
h: number().required(),
})
.default(undefined)
.optional(),
});

// $ExpectType { h: number; } | undefined
optionalNonDefaultedObj.cast({}).nested;
}

SchemaOfDate: {
Expand Down Expand Up @@ -959,13 +970,13 @@ Object: {
}

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

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

// $ExpectType StringSchema<string, AnyObject, undefined, ""> | NumberSchema<number | undefined, AnyObject, undefined, "">
// $ExpectType NumberSchema<number | undefined, AnyObject, undefined, ""> | StringSchema<string, AnyObject, undefined, "">
string().when('foo', {
is: true,
then: () => number(),
Expand Down

0 comments on commit 1afbac0

Please sign in to comment.