From 300b52e31c99446f5c16661b3a5f3c58f5ccdbd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Thu, 28 Dec 2023 18:58:01 +0100 Subject: [PATCH] Subtraiting tests --- src/tests-inheritance.ts | 28 ++++++++++++++++++++++------ src/trait-inheritance.ts | 12 +++++++++--- 2 files changed, 31 insertions(+), 9 deletions(-) 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) }