diff --git a/src/abstract.ts b/src/abstract.ts index 1cf2562..c6502e4 100644 --- a/src/abstract.ts +++ b/src/abstract.ts @@ -5,6 +5,6 @@ export type AbstractTag = "@thilawyn/traitify-ts/Abstract" export function abstract< Abstract extends {} = {} ->(): Opaque { - return undefined as any +>() { + return {} as Opaque } diff --git a/src/trait.ts b/src/trait.ts index e5608cb..6ae2eaf 100644 --- a/src/trait.ts +++ b/src/trait.ts @@ -28,17 +28,27 @@ type RemoveAbstractFromImpl< export class Trait< - Abstract extends {}, - Impl extends Class<{}, []>, + Abstract extends {}, + Impl extends Class<{}, []>, + Supertraits extends Trait[] > { constructor( - readonly abstract: Abstract, - readonly apply: (Super: AbstractClass<{}>) => Impl, + readonly supertraits: Supertraits, + readonly ownAbstract: Abstract, + readonly apply: (Super: AbstractClass<{}>) => Impl, ) {} } +export interface Trait< + Abstract extends {}, + Impl extends Class<{}, []>, + Supertraits extends Trait[] +> { + get ownImplClass(): Impl +} + export type TraitAbstractMembers = ( - T extends Trait + T extends Trait ? AbstractMembers : never ) @@ -48,7 +58,7 @@ export interface TraitAbstractMembersFn extends Fn { } export type TraitImplClass = ( - T extends Trait + T extends Trait ? Impl : never ) @@ -102,6 +112,7 @@ export function trait< ), ) { return new Trait( + [] as const, abstract as Abstract, apply as any as (Super: AbstractClass<{}>) => RemoveAbstractFromImpl, )