diff --git a/src/tests-inheritance.ts b/src/tests-inheritance.ts index bc594ba..8241b1a 100644 --- a/src/tests-inheritance.ts +++ b/src/tests-inheritance.ts @@ -1,7 +1,7 @@ -import { extendsAndExpresses, trait } from "./trait-inheritance" +import { expresses, trait } from "./trait-inheritance" -const Identified = () => +const Identifiable = () => trait(Parent => { abstract class Identified extends Parent { abstract id: ID @@ -9,11 +9,25 @@ const Identified = () => equals(el: Identified) { return this.id === el.id } + + constructor(...args: any[]) { + super(...args) + console.log("Identified constructor") + } } return Identified }) +const ImplementsIdentifiable = (defaultID: ID) => + trait(Parent => { + abstract class ImplementsIdentifiable extends Identifiable()(Parent) { + id: ID = defaultID + } + + return ImplementsIdentifiable + }) + const Permissible = trait(Parent => { abstract class Permissible extends Parent { @@ -30,14 +44,16 @@ const Permissible = trait(Parent => { }) -const UserProto = extendsAndExpresses(class {}, [ - Identified(), +const UserProto = expresses( + // Identifiable(), + ImplementsIdentifiable(0n), Permissible, -] as const) +) class User extends UserProto { - constructor(readonly id: bigint) { + constructor(id: bigint) { super() + this.id = id } } diff --git a/src/trait-inheritance.ts b/src/trait-inheritance.ts index eb7a3dd..f852ac8 100644 --- a/src/trait-inheritance.ts +++ b/src/trait-inheritance.ts @@ -38,13 +38,12 @@ export function trait< export function extendsAndExpresses< - C extends AbstractClass, + C extends AbstractClass, Traits extends readonly Trait[], >( extend: C, traits: Traits, ) { - return traits.reduce( (previous, trait) => trait(previous), extend, @@ -71,5 +70,12 @@ export function extendsAndExpresses< > > ) - +} + +export function expresses< + Traits extends readonly Trait[], +>( + ...traits: Traits +) { + return extendsAndExpresses(Object, traits) }