diff --git a/src/effect/EffectSchemaTraitExpressionBuilder.ts b/src/effect/EffectSchemaTraitExpressionBuilder.ts index 8e8139f..50a4110 100644 --- a/src/effect/EffectSchemaTraitExpressionBuilder.ts +++ b/src/effect/EffectSchemaTraitExpressionBuilder.ts @@ -1,5 +1,6 @@ import { Schema as S } from "@effect/schema" import * as Types from "effect/Types" +import { Simplify } from "type-fest" import { Trait, TraitTuple } from "../Trait" import { TraitExpression } from "../TraitExpression" import { TraitExpressionBuilder } from "../TraitExpressionBuilder" @@ -40,7 +41,7 @@ export class EffectSchemaInitialTraitExpressionBuilder { } extends< - Super extends S.Class, + Super extends StaticMembers>, Self, Fields extends S.Struct.Fields, I, R, C, @@ -49,14 +50,28 @@ export class EffectSchemaInitialTraitExpressionBuilder { NewFields extends S.Struct.Fields, >( - superclass: Super | S.Class, + superclass: Super | StaticMembers>, identifier: string, fields: NewFields, annotations?: S.Annotations.Schema, ) { return new EffectSchemaTraitExpressionBuilder( - superclass.extend(identifier)(fields, annotations), - {} as Omit, keyof S.Class>, + superclass.extend(identifier)(fields, annotations) as S.Class< + unknown, + Fields & NewFields, + I & S.Struct.Encoded, + R | S.Struct.Context, + C & S.Struct.Constructor, + Self, + Proto + >, + + {} as Simplify< + Omit + > + >, + [], ) } diff --git a/src/effect/tests.ts b/src/effect/tests.ts index 315bf07..a241123 100644 --- a/src/effect/tests.ts +++ b/src/effect/tests.ts @@ -24,7 +24,7 @@ type Extr = : never type InspectSchemaClass = T extends S.Class - ? C + ? Inherited : never @@ -38,14 +38,11 @@ const userExp = effectSchemaExpression .build() @userExp.staticImplements -class User extends userExp.extends() implements Implements { +export class User extends userExp.extends() implements Implements { aMethodThatShouldBeInherited() {} static aStaticMethodThatShouldBeInherited() {} } -type T1 = InspectSchemaClass -type T2 = InstanceType - const user = new User({ id: 0n, role: "User" }) // user.id = 0n @@ -57,8 +54,10 @@ const adminExp = effectSchemaExpression // .immutable() .build() +type T = InspectSchemaClass + @adminExp.staticImplements -class Admin extends adminExp.extends() implements Implements { +export class Admin extends adminExp.extends() implements Implements { } const admin = new Admin({ id: 1n, role: "Admin" })