Class type detection
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
Julien Valverdé
2024-01-24 21:40:27 +01:00
parent 338c750a4b
commit 516ce0ade2
4 changed files with 32 additions and 8 deletions

View File

@@ -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<any>,
Self extends AbstractClass<any>,
> = (
AbstractClass<
Class<
GetClassType<Parent>,
Omit<InstanceType<Parent>, keyof InstanceType<DefaultZodSchemaClass>> &
InstanceType<Self>,

View File

@@ -128,3 +128,20 @@ export function ZodSchemaClassOf<
StaticMembers<TZodSchemaClassImpl>
)
}
export function ZodSchemaClass<
SchemaT extends z.ZodRawShape,
SchemaUnknownKeys extends z.UnknownKeysParam,
SchemaCatchall extends z.ZodTypeAny,
Values extends {},
DefaultValues extends Partial<Values>,
>(
props: {
schema: z.ZodObject<SchemaT, SchemaUnknownKeys, SchemaCatchall, Values, Values>
defaultValues: Opaque<DefaultValues, DefinedDefaultValuesTag>
},
) {
return ZodSchemaClassOf(Object, props)
}

View File

@@ -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()

View File

@@ -22,6 +22,14 @@ export type Class<
: never
)
export type GetClassType<C> = (
C extends ConcreteClass<any>
? "Class"
: C extends AbstractClass<any>
? "AbstractClass"
: never
)
/**
* Represents the static members of a class.