diff --git a/src/TraitBuilder.ts b/src/TraitBuilder.ts index 28b242f..30ad5f2 100644 --- a/src/TraitBuilder.ts +++ b/src/TraitBuilder.ts @@ -4,35 +4,74 @@ import { TraitExpression } from "./TraitExpression" import { ExtendPlain, StaticMembers } from "./util" -type ExtendAbstractSuper = ( - Simplify< +// 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[] + >, + Abstract extends object, + StaticAbstract extends object, +> = ( + AbstractClass< ExtendPlain<[ - ...MapTraitsToOwnAbstract< + ...MapTraitsToOwnImplInstance< TraitExpression.Traits >, Abstract, ]> - > -) - -type MapTraitsToOwnAbstract = { - [K in keyof T]: Trait.OwnAbstract -} - - -type ExtendStaticAbstractSuper = ( - Simplify< - ExtendPlain<[ - ...MapTraitsToOwnStaticAbstract< + > & + // ExtendPlain<[ + // ...MapTraitsToOwnImplStaticMembers< + // TraitExpression.Traits + // >, + // StaticAbstract, + // ]> + ExtendPlain< + MapStaticMembers< + MapTraitsToOwnImplStaticMembers< TraitExpression.Traits - >, - StaticAbstract, - ]> + > + > > ) - -type MapTraitsToOwnStaticAbstract = { - [K in keyof T]: Trait.OwnStaticAbstract +type MapTraitsToOwnImplInstance = { + [K in keyof T]: InstanceType> +} +type MapTraitsToOwnImplStaticMembers = { + [K in keyof T]: Trait.OwnImplClass +} +type MapStaticMembers[]> = { + [TupleK in keyof Tuple]: { + [ClassK in keyof Tuple[TupleK]]: Tuple[TupleK][ClassK] + } } @@ -117,11 +156,12 @@ export class TraitBuilder< this.traitSuperExpression, this.traitAbstract, this.traitStaticAbstract, - apply as unknown as (Super: AbstractClass) => RemoveAbstractFromImplClass< - ImplClassWithAbstract, - ExtendAbstractSuper, - ExtendStaticAbstractSuper - >, + // apply as unknown as (Super: AbstractClass) => RemoveAbstractFromImplClass< + // ImplClassWithAbstract, + // ExtendAbstractSuper, + // ExtendStaticAbstractSuper + // >, + apply as unknown as (Super: AbstractClass) => ImplClassWithAbstract, ) } diff --git a/src/tests.ts b/src/tests.ts index bc0ad49..99f2d9c 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -1,7 +1,8 @@ -import { TraitClass } from "./Trait" +import { Trait, TraitClass } from "./Trait" import { trait } from "./TraitBuilder" -import { Implements, ImplementsStatic } from "./TraitExpression" +import { Implements, ImplementsStatic, TraitExpression } from "./TraitExpression" import { expression } from "./TraitExpressionBuilder" +import { ExtendPlain } from "./util" const PrintsHelloOnNew = trait @@ -80,3 +81,18 @@ class User extends exp.extends implements Implements { } console.log(new User()) + + +type ExpectsObjectArray = T + +type Maps = { + [K in keyof T]: T[K] +} + +type MapTraits> = ( + ExpectsObjectArray< + Maps< + + > + > +)