diff --git a/src/effect/EffectSchemaTraitExpression.ts b/src/effect/EffectSchemaTraitExpression.ts index 7f3cfd4..7707758 100644 --- a/src/effect/EffectSchemaTraitExpression.ts +++ b/src/effect/EffectSchemaTraitExpression.ts @@ -7,10 +7,7 @@ import { Extend } from "../util" export class EffectSchemaTraitExpression< Fields extends S.Struct.Fields, - A, - I, - R, - C, + A, I, R, C, Inherited extends object, Proto, Static extends object, @@ -18,12 +15,13 @@ export class EffectSchemaTraitExpression< const Traits extends readonly Trait[], > implements TraitExpressionLike< - S.Class & Static, + S.Class, Traits > { constructor( - readonly superclass: S.Class & Static, - readonly traits: Traits, + readonly superclass: S.Class, + readonly superclassStatic: Static, + readonly traits: Traits, ) {} @@ -31,10 +29,7 @@ implements TraitExpressionLike< S.Class< Self, Fields, - A, - I, - R, - C, + A, I, R, C, Simplify< Extend<[ Inherited, diff --git a/src/effect/EffectSchemaTraitExpressionBuilder.ts b/src/effect/EffectSchemaTraitExpressionBuilder.ts index 42ad51e..126404c 100644 --- a/src/effect/EffectSchemaTraitExpressionBuilder.ts +++ b/src/effect/EffectSchemaTraitExpressionBuilder.ts @@ -1,5 +1,6 @@ import { Schema as S } from "@effect/schema" -import { Mutable, Simplify } from "effect/Types" +import * as Types from "effect/Types" +import { Simplify } from "type-fest" import { Trait, TraitTuple } from "../Trait" import { TraitExpression } from "../TraitExpression" import { TraitExpressionBuilder } from "../TraitExpressionBuilder" @@ -19,6 +20,7 @@ export class EffectSchemaInitialTraitExpressionBuilder { ) { return new EffectSchemaTraitExpressionBuilder( S.Class(identifier)(fields, annotations), + {}, [], ) } @@ -33,6 +35,7 @@ export class EffectSchemaInitialTraitExpressionBuilder { ) { return new EffectSchemaTraitExpressionBuilder( S.TaggedClass()(tag, fields, annotations), + {}, [], ) } @@ -41,10 +44,7 @@ export class EffectSchemaInitialTraitExpressionBuilder { Super extends S.Class, Fields extends S.Struct.Fields, - A, - I, - R, - C, + A, I, R, C, Inherited extends object, Proto, @@ -55,19 +55,22 @@ export class EffectSchemaInitialTraitExpressionBuilder { fields: NewFields, annotations?: S.Annotations.Schema, ) { - return new EffectSchemaTraitExpressionBuilder< - Fields & NewFields, - Simplify>, - Simplify>, - R | S.Struct.Context, - Simplify>, - InstanceType, - Proto, - StaticMembers, + return new EffectSchemaTraitExpressionBuilder( + superclass.extend(identifier)(fields, annotations) as S.Class< + unknown, + Fields & NewFields, + Types.Simplify>, + Types.Simplify>, + R | S.Struct.Context, + Types.Simplify>, + InstanceType, + Proto + >, + + {} as Simplify< + Omit, keyof S.Class> + >, - readonly [] - >( - superclass.extend(identifier)(fields, annotations) as any, [], ) } @@ -76,10 +79,7 @@ export class EffectSchemaInitialTraitExpressionBuilder { export class EffectSchemaTraitExpressionBuilder< Fields extends S.Struct.Fields, - A, - I, - R, - C, + A, I, R, C, Inherited extends object, Proto, Static extends object, @@ -87,39 +87,42 @@ export class EffectSchemaTraitExpressionBuilder< const Traits extends readonly Trait[], > { constructor( - readonly expressionSuperclass: S.Class & Static, - readonly expressionTraits: Traits, + readonly expressionSuperclass: S.Class, + readonly expressionSuperclassStatic: Static, + readonly expressionTraits: Traits, ) {} - mutable(): EffectSchemaTraitExpressionBuilder< - Fields, - Mutable, - I, - R, - C, - Inherited, - Proto, - Static, - - Traits - > { - return new EffectSchemaTraitExpressionBuilder(this.expressionSuperclass, this.expressionTraits) + mutable() { + return new EffectSchemaTraitExpressionBuilder( + this.expressionSuperclass as S.Class, I, R, C, Inherited, Proto>, + this.expressionSuperclassStatic, + this.expressionTraits, + ) } - mutableEncoded(): EffectSchemaTraitExpressionBuilder< - Fields, - A, - Mutable, - R, - C, - Inherited, - Proto, - Static, + immutable() { + return new EffectSchemaTraitExpressionBuilder( + this.expressionSuperclass as S.Class, I, R, C, Inherited, Proto>, + this.expressionSuperclassStatic, + this.expressionTraits, + ) + } - Traits - > { - return new EffectSchemaTraitExpressionBuilder(this.expressionSuperclass, this.expressionTraits) + mutableEncoded() { + return new EffectSchemaTraitExpressionBuilder( + this.expressionSuperclass as S.Class, R, C, Inherited, Proto>, + this.expressionSuperclassStatic, + this.expressionTraits, + ) + } + + immutableEncoded() { + return new EffectSchemaTraitExpressionBuilder( + this.expressionSuperclass as S.Class, R, C, Inherited, Proto>, + this.expressionSuperclassStatic, + this.expressionTraits, + ) } @@ -135,25 +138,15 @@ export class EffectSchemaTraitExpressionBuilder< >[] >( ...traits: T - ): EffectSchemaTraitExpressionBuilder< - Fields, - A, - I, - R, - C, - Inherited, - Proto, - Static, - - TraitExpressionBuilder.ExpressesReturnTypeTraits - > { + ) { return new EffectSchemaTraitExpressionBuilder( this.expressionSuperclass, + this.expressionSuperclassStatic, traitsUnique([ ...this.expressionTraits, ...spreadSupertraits(traits), - ]), + ]) as TraitExpressionBuilder.ExpressesReturnTypeTraits, ) } @@ -175,10 +168,7 @@ export class EffectSchemaTraitExpressionBuilder< ? "Type conflict between the traits implementation static members and/or the superclass static members." : EffectSchemaTraitExpression< Fields, - A, - I, - R, - C, + A, I, R, C, Inherited, Proto, Static, @@ -186,7 +176,11 @@ export class EffectSchemaTraitExpressionBuilder< Traits > ) { - return new EffectSchemaTraitExpression(this.expressionSuperclass, this.expressionTraits) as any + return new EffectSchemaTraitExpression( + this.expressionSuperclass, + this.expressionSuperclassStatic, + this.expressionTraits, + ) as any } } diff --git a/src/effect/tests.ts b/src/effect/tests.ts index 34b0b97..2ed34b7 100644 --- a/src/effect/tests.ts +++ b/src/effect/tests.ts @@ -1,6 +1,26 @@ import { Schema as S } from "@effect/schema" import { Implements } from "../TraitExpression" import { effectSchemaExpression } from "./EffectSchemaTraitExpressionBuilder" +import { StaticMembers } from "../util" +import { Trait } from "../Trait" +import { EffectSchemaTraitExpression } from "./EffectSchemaTraitExpression" + + +type Extr = + T extends EffectSchemaTraitExpression< + infer Fields, + infer A, + infer I, + infer R, + infer C, + infer Inherited, + infer Proto, + infer Static, + + infer Traits + > + ? Static + : never const userExp = effectSchemaExpression @@ -27,11 +47,15 @@ const adminExp = effectSchemaExpression .extends(User, "User", { role: S.Literal("Admin") }) + .immutable() .build() +adminExp.superclass +type T = Extr + @adminExp.staticImplements class Admin extends adminExp.extends() implements Implements { } const admin = new Admin({ id: 1n, role: "Admin" }) -// admin.id = 1n +// admin.role = "Admin"