From 516ce0ade2a34728fb73608f467a02d91a763a6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Wed, 24 Jan 2024 21:40:27 +0100 Subject: [PATCH] Class type detection --- src/TZodSchemaClass.ts | 6 ++++-- src/ZodSchemaClass.ts | 17 +++++++++++++++++ src/tests.ts | 9 +++------ src/util.ts | 8 ++++++++ 4 files changed, 32 insertions(+), 8 deletions(-) diff --git a/src/TZodSchemaClass.ts b/src/TZodSchemaClass.ts index 72e665f..4dd40c7 100644 --- a/src/TZodSchemaClass.ts +++ b/src/TZodSchemaClass.ts @@ -2,7 +2,7 @@ import { Effect } from "effect" import { AbstractClass, Class as ConcreteClass, HasRequiredKeys, Opaque } from "type-fest" import { z } from "zod" import { DefinedDefaultValuesTag } from "." -import { Class, ClassType, StaticMembers } from "./util" +import { Class, ClassType, GetClassType, StaticMembers } from "./util" export type NewZodSchemaInstanceInput< @@ -28,7 +28,9 @@ type ExtendZodSchemaClass< Parent extends AbstractClass, Self extends AbstractClass, > = ( - AbstractClass< + Class< + GetClassType, + Omit, keyof InstanceType> & InstanceType, diff --git a/src/ZodSchemaClass.ts b/src/ZodSchemaClass.ts index 39c3c9a..9886e1f 100644 --- a/src/ZodSchemaClass.ts +++ b/src/ZodSchemaClass.ts @@ -128,3 +128,20 @@ export function ZodSchemaClassOf< StaticMembers ) } + + +export function ZodSchemaClass< + SchemaT extends z.ZodRawShape, + SchemaUnknownKeys extends z.UnknownKeysParam, + SchemaCatchall extends z.ZodTypeAny, + + Values extends {}, + DefaultValues extends Partial, +>( + props: { + schema: z.ZodObject + defaultValues: Opaque + }, +) { + return ZodSchemaClassOf(Object, props) +} diff --git a/src/tests.ts b/src/tests.ts index de23363..7c72022 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -1,12 +1,8 @@ import { z } from "zod" -import { ZodSchemaClassOf, defineDefaultValues } from "." +import { ZodSchemaClass, defineDefaultValues } from "." -class Root { -} - - -class Test extends ZodSchemaClassOf(Root, { +class Test extends ZodSchemaClass({ schema: z.object({ id: z.bigint(), name: z.string(), @@ -18,6 +14,7 @@ class Test extends ZodSchemaClassOf(Root, { Test.defaultValues const inst = await Test.instantiatePromise({ id: 1n, name: "" }) + class SubTest extends Test.extend({ schema: ({ schema }) => schema.extend({ prout: z.string() diff --git a/src/util.ts b/src/util.ts index a1c11d4..338309f 100644 --- a/src/util.ts +++ b/src/util.ts @@ -22,6 +22,14 @@ export type Class< : never ) +export type GetClassType = ( + C extends ConcreteClass + ? "Class" + : C extends AbstractClass + ? "AbstractClass" + : never +) + /** * Represents the static members of a class.