From 2d71f32a4faed357f9cae92c461ad16ef2e31d83 Mon Sep 17 00:00:00 2001 From: Jason Quense Date: Thu, 10 Dec 2020 13:31:21 -0500 Subject: [PATCH] fix(types): SchemaOf doesn't produce a union of base schema --- src/index.ts | 14 +++++++++++++- test/types.ts | 4 ++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/index.ts b/src/index.ts index 92a0258d4..1bf992f43 100644 --- a/src/index.ts +++ b/src/index.ts @@ -37,13 +37,25 @@ function addMethod(schemaType: any, name: string, fn: any) { schemaType.prototype[name] = fn; } +type ObjectSchemaOf = ObjectSchema< + { + [k in keyof T]-?: T[k] extends AnyObject + ? // we can't use ObjectSchema<{ []: SchemaOf }> b/c TS produces a union of two schema + ObjectSchemaOf + : T[k] extends Array + ? ArraySchema> + : BaseSchema, AnyObject, T[k]>; + } +>; + type SchemaOf = T extends AnyObject - ? ObjectSchema<{ [k in keyof T]: SchemaOf }> + ? ObjectSchemaOf : T extends Array ? ArraySchema> : BaseSchema, AnyObject, T>; export type AnyObjectSchema = ObjectSchema; + export type { SchemaOf, TypeOf, Asserts, Asserts as InferType, AnySchema }; export { diff --git a/test/types.ts b/test/types.ts index d7f29d479..13ca36fd6 100644 --- a/test/types.ts +++ b/test/types.ts @@ -186,12 +186,16 @@ ObjectOmit: { SchemaOf: { type Person = { firstName: string; + title: string | undefined; + age?: number; }; type PersonSchema = SchemaOf; const _t: PersonSchema = object({ firstName: string().defined(), + title: string(), + age: number(), }); }