Skip to content

Commit 2d71f32

Browse files
committed
fix(types): SchemaOf doesn't produce a union of base schema
1 parent b53e5f2 commit 2d71f32

File tree

2 files changed

+17
-1
lines changed

2 files changed

+17
-1
lines changed

src/index.ts

+13-1
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,25 @@ function addMethod(schemaType: any, name: string, fn: any) {
3737
schemaType.prototype[name] = fn;
3838
}
3939

40+
type ObjectSchemaOf<T extends AnyObject> = ObjectSchema<
41+
{
42+
[k in keyof T]-?: T[k] extends AnyObject
43+
? // we can't use ObjectSchema<{ []: SchemaOf<T[k]> }> b/c TS produces a union of two schema
44+
ObjectSchemaOf<T[k]>
45+
: T[k] extends Array<infer E>
46+
? ArraySchema<SchemaOf<E>>
47+
: BaseSchema<Maybe<T[k]>, AnyObject, T[k]>;
48+
}
49+
>;
50+
4051
type SchemaOf<T> = T extends AnyObject
41-
? ObjectSchema<{ [k in keyof T]: SchemaOf<T[k]> }>
52+
? ObjectSchemaOf<T>
4253
: T extends Array<infer E>
4354
? ArraySchema<SchemaOf<E>>
4455
: BaseSchema<Maybe<T>, AnyObject, T>;
4556

4657
export type AnyObjectSchema = ObjectSchema<any, any, any, any>;
58+
4759
export type { SchemaOf, TypeOf, Asserts, Asserts as InferType, AnySchema };
4860

4961
export {

test/types.ts

+4
Original file line numberDiff line numberDiff line change
@@ -186,12 +186,16 @@ ObjectOmit: {
186186
SchemaOf: {
187187
type Person = {
188188
firstName: string;
189+
title: string | undefined;
190+
age?: number;
189191
};
190192

191193
type PersonSchema = SchemaOf<Person>;
192194

193195
const _t: PersonSchema = object({
194196
firstName: string().defined(),
197+
title: string(),
198+
age: number(),
195199
});
196200
}
197201

0 commit comments

Comments
 (0)