From 0d469fabebd8526ad954ef21f9c1cd671d4d2a1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sat, 3 Feb 2024 23:15:30 +0100 Subject: [PATCH] Trait refactoring --- src/abstract.ts | 4 ++-- src/trait.ts | 23 +++++++++++++++++------ 2 files changed, 19 insertions(+), 8 deletions(-) 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, )