diff --git a/src/Trait.ts b/src/Trait.ts index e8f5cfd..2a2cfbe 100644 --- a/src/Trait.ts +++ b/src/Trait.ts @@ -97,11 +97,15 @@ export namespace Trait { export namespace Traits { export type MapImplClass = { - [K in keyof T]: Trait.OwnImplClass + [K in keyof T]: K extends keyof [] + ? T[K] + : Trait.OwnImplClass } export type MapImplInstance = { - [K in keyof T]: Trait.OwnImplInstance + [K in keyof T]: K extends keyof [] + ? T[K] + : Trait.OwnImplInstance } export type MapImplStaticMembers = { diff --git a/src/TraitBuilder.ts b/src/TraitBuilder.ts index 420202c..1a68621 100644 --- a/src/TraitBuilder.ts +++ b/src/TraitBuilder.ts @@ -5,18 +5,25 @@ import { ExtendPlain, StaticMembers } from "./util" type ImplSuper< - Supertraits extends Trait[], + SuperExpression extends TraitExpression< + typeof TraitExpression.NullSuperclass, + Trait[] + >, Abstract extends object, StaticAbstract extends object, > = ( AbstractClass< ExtendPlain<[ - ...Traits.MapImplInstance, + ...Traits.MapImplInstance< + TraitExpression.Traits + >, Abstract, ]> > & ExtendPlain<[ - ...Traits.MapImplStaticMembers, + ...Traits.MapImplStaticMembers< + TraitExpression.Traits + >, StaticAbstract, ]> & { readonly _tag: "@thilawyn/traitify-ts/Super" } // TODO: replace with unique symbol? @@ -63,17 +70,13 @@ export class TraitBuilder< implement< ImplClassWithAbstract extends ImplSuper< // TODO: use This instead? - TraitExpression.Traits, + SuperExpression, Abstract, StaticAbstract > >( apply: ( - Super: ImplSuper< - TraitExpression.Traits, - Abstract, - StaticAbstract - > + Super: ImplSuper ) => ImplClassWithAbstract ) { return new TraitBuilder(