From ffce582e03d5b1d0bcda901a7aef7a6abc3e695b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Thu, 8 Feb 2024 01:17:01 +0100 Subject: [PATCH] ZodSchemaClass work --- src/ZodSchemaClass.ts | 26 +++++++++++++++++++------- src/tests.ts | 2 +- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/ZodSchemaClass.ts b/src/ZodSchemaClass.ts index 42425ae..765d5c5 100644 --- a/src/ZodSchemaClass.ts +++ b/src/ZodSchemaClass.ts @@ -1,9 +1,9 @@ import { expression } from "@thilawyn/traitify-ts" import { NoInfer } from "effect/Types" -import { AbstractClass, Opaque } from "type-fest" +import { AbstractClass, Class } from "type-fest" import { z } from "zod" -import { DefinedDefaultValuesTag } from "." import { InstantiableZodSchemaObject } from "./traits/InstantiableZodSchemaObject" +import { StaticMembers } from "./util" export function ZodSchemaClassOf< @@ -14,21 +14,33 @@ export function ZodSchemaClassOf< SchemaCatchall extends z.ZodTypeAny, Values extends {}, - DefaultValues extends NoInfer>, + DefaultValues extends Partial, >( of: Superclass, { schema, defaultValues }: { schema: z.ZodObject - defaultValues: DefaultValues + defaultValues: NoInfer }, ) { const exp = expression - .extends(of) + .extends(class extends (of as AbstractClass<{}, []>) { + static readonly schema = schema + static readonly defaultValues = defaultValues + + constructor(values: Values) { + super() + Object.assign(this, values) + } + }) .expresses(InstantiableZodSchemaObject) .build() - return exp + return exp.extends as Class< + InstanceType & Values, + ConstructorParameters + > & + StaticMembers } @@ -44,7 +56,7 @@ export function ZodSchemaClass< >( props: { schema: z.ZodObject - defaultValues: Opaque + defaultValues: NoInfer }, ) { return ZodSchemaClassOf(DefaultRoot, props) diff --git a/src/tests.ts b/src/tests.ts index 11c510f..235964b 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -8,7 +8,7 @@ class Test extends ZodSchemaClass({ name: z.string(), }), - defaultValues: defineDefaultValues({ id: -1n }), + defaultValues: { id: -1n }, }) {} Test.defaultValues