diff --git a/src/TraitBuilder.ts b/src/TraitBuilder.ts index c54c34c..6d61efc 100644 --- a/src/TraitBuilder.ts +++ b/src/TraitBuilder.ts @@ -1,32 +1,34 @@ import { AbstractClass, Simplify } from "type-fest" -import { Trait, Traits } from "./Trait" +import { Trait } from "./Trait" import { TraitExpression } from "./TraitExpression" import { ExtendPlain, StaticMembers } from "./util" -type ImplSuper< - SuperExpression extends TraitExpression< - typeof TraitExpression.NullSuperclass, - Trait[] - >, - Abstract extends object, - StaticAbstract extends object, -> = ( - AbstractClass< - ExtendPlain<[ - ...Traits.MapImplInstance< - TraitExpression.Traits - >, - Abstract, - ]> - > & - ExtendPlain<[ - ...Traits.MapImplStaticMembers< - TraitExpression.Traits - >, - StaticAbstract, - ]> & - { readonly _tag: "@thilawyn/traitify-ts/Super" } // TODO: replace with unique symbol? +type ImplSuper = ( + This extends TraitBuilder< + any, + infer Abstract, + infer StaticAbstract, + infer ImplClass + > + ? ( + AbstractClass< + Simplify< + ExtendPlain<[ + Abstract, + InstanceType, + ]> + > + > & + Simplify< + ExtendPlain<[ + StaticAbstract, + StaticMembers, + ]> + > & + { readonly _tag: "@thilawyn/traitify-ts/Super" } // TODO: replace with unique symbol? + ) + : never ) @@ -69,15 +71,9 @@ export class TraitBuilder< } implement< - ImplClassWithAbstract extends ImplSuper< // TODO: use This instead? - SuperExpression, - Abstract, - StaticAbstract - > + ImplClassWithAbstract extends ImplSuper >( - apply: ( - Super: ImplSuper - ) => ImplClassWithAbstract + apply: (Super: ImplSuper) => ImplClassWithAbstract ) { return new TraitBuilder( this.traitSuperExpression, @@ -91,9 +87,7 @@ export class TraitBuilder< InstanceType, keyof Abstract > - >, - - ConstructorParameters + > > & Simplify< Omit<