diff --git a/src/Trait.ts b/src/Trait.ts index 3f2e39f..4ba2450 100644 --- a/src/Trait.ts +++ b/src/Trait.ts @@ -65,6 +65,10 @@ export namespace Trait { return: Trait.OwnImplInstance } + export type OwnImplStaticMembers = ( + StaticMembers> + ) + export type OwnClass = ( AbstractClass, any[]> & Extend<[ @@ -91,6 +95,20 @@ export namespace Trait { } } +export namespace Traits { + export type MapImplClass = { + [K in keyof T]: Trait.OwnImplClass + } + + export type MapImplInstance = { + [K in keyof T]: Trait.OwnImplInstance + } + + export type MapImplStaticMembers = { + [K in keyof T]: Trait.OwnImplStaticMembers + } +} + export type TraitClass> = ( AbstractClass, any[]> & diff --git a/src/TraitBuilder.ts b/src/TraitBuilder.ts index b92658d..4c95b0a 100644 --- a/src/TraitBuilder.ts +++ b/src/TraitBuilder.ts @@ -1,97 +1,25 @@ import { AbstractClass, Class, Simplify } from "type-fest" -import { Trait, TraitClass, TraitConcreteClass } from "./Trait" +import { Trait, Traits } from "./Trait" import { TraitExpression } from "./TraitExpression" import { ExtendPlain, StaticMembers } from "./util" -// type ExtendAbstractSuper = ( -// Simplify< -// ExtendPlain<[ -// ...MapTraitsToOwnAbstract< -// TraitExpression.Traits -// >, -// Abstract, -// ]> -// > -// ) -// type MapTraitsToOwnAbstract = { -// [K in keyof T]: Trait.OwnAbstract -// } - -// type ExtendStaticAbstractSuper, StaticAbstract extends object> = ( -// Simplify< -// ExtendPlain<[ -// ...MapTraitsToOwnStaticAbstract< -// TraitExpression.Traits -// >, -// StaticAbstract, -// ]> -// > -// ) -// type MapTraitsToOwnStaticAbstract = { -// [K in keyof T]: Trait.OwnStaticAbstract -// } - type ImplSuper< - SuperExpression extends TraitExpression< - any, - Trait[] - >, + Supertraits extends Trait[], Abstract extends object, StaticAbstract extends object, > = ( AbstractClass< ExtendPlain<[ - ...MapTraitsToOwnImplInstance< - TraitExpression.Traits - >, + ...Traits.MapImplInstance, Abstract, ]> > & - // ExtendPlain<[ - // ...MapTraitsToOwnImplStaticMembers< - // TraitExpression.Traits - // >, - // StaticAbstract, - // ]> - ExtendPlain< - MapStaticMembers< - MapTraitsToOwnImplStaticMembers< - TraitExpression.Traits - > - > - > -) -type MapTraitsToOwnImplInstance = { - [K in keyof T]: InstanceType> -} -type MapTraitsToOwnImplStaticMembers = { - [K in keyof T]: Trait.OwnImplClass -} -type MapStaticMembers[]> = { - [K in keyof T]: StaticMembers -} - - -type TraitApplierSuperTag = "@thilawyn/traitify-ts/Super" - -type RemoveAbstractFromImplClass< - ImplClassWithAbstract extends AbstractClass, - Abstract extends object, - StaticAbstract extends object, -> = ( - Class< - Omit< - InstanceType, - keyof Abstract - >, - - ConstructorParameters - > & - Omit< - StaticMembers, - keyof StaticAbstract | "_tag" - > + ExtendPlain<[ + ...Traits.MapImplStaticMembers, + StaticAbstract, + ]> & + { readonly _tag: "@thilawyn/traitify-ts/Super" } // TODO: replace with unique symbol? ) @@ -134,32 +62,43 @@ export class TraitBuilder< } implement< - ImplClassWithAbstract extends ( - TraitConcreteClass< - Trait - > & - { _tag: TraitApplierSuperTag } - ) + ImplClassWithAbstract extends ImplSuper< // TODO: use This instead? + TraitExpression.Traits, + Abstract, + StaticAbstract + > >( apply: ( - Super: ( - TraitClass< - Trait - > & - { _tag: TraitApplierSuperTag } - ) + Super: ImplSuper< + TraitExpression.Traits, + Abstract, + StaticAbstract + > ) => ImplClassWithAbstract ) { return new TraitBuilder( this.traitSuperExpression, this.traitAbstract, this.traitStaticAbstract, - // apply as unknown as (Super: AbstractClass) => RemoveAbstractFromImplClass< - // ImplClassWithAbstract, - // ExtendAbstractSuper, - // ExtendStaticAbstractSuper - // >, - apply as unknown as (Super: AbstractClass) => ImplClassWithAbstract, + + apply as unknown as (Super: AbstractClass) => ( + Class< + Simplify< + Omit< + InstanceType, + keyof Abstract + > + >, + + ConstructorParameters + > & + Simplify< + Omit< + StaticMembers, + keyof StaticAbstract | "_tag" + > + > + ), ) } diff --git a/src/tests.ts b/src/tests.ts index 8c2207d..bc0ad49 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -1,9 +1,7 @@ -import { AbstractClass } from "type-fest" -import { Trait, TraitClass } from "./Trait" +import { TraitClass } from "./Trait" import { trait } from "./TraitBuilder" -import { Implements, ImplementsStatic, TraitExpression } from "./TraitExpression" +import { Implements, ImplementsStatic } from "./TraitExpression" import { expression } from "./TraitExpressionBuilder" -import { ExtendPlain, StaticMembers } from "./util" const PrintsHelloOnNew = trait @@ -82,29 +80,3 @@ class User extends exp.extends implements Implements { } console.log(new User()) - - -type ExpectObjectArray = T - -type MapOwnImplClass = { - [K in keyof T]: Trait.OwnImplClass -} - -type MapStaticMembers = { - [K in keyof T]: StaticMembers -} - - -type MapClasses = ( - Exp extends TraitExpression - ? ExpectObjectArray< - MapStaticMembers< - MapOwnImplClass< - Traits - > - > - > - : never -) - -type Output = MapClasses