From a065daec1e88b3ff48f3008ceaef9e55f223ff43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Wed, 14 Feb 2024 21:57:48 +0100 Subject: [PATCH] extendAbstract --- src/TraitBuilder.ts | 13 +++++++++++++ src/tests.ts | 16 ++++++++++++---- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/TraitBuilder.ts b/src/TraitBuilder.ts index 6c43e8b..24d62ea 100644 --- a/src/TraitBuilder.ts +++ b/src/TraitBuilder.ts @@ -57,6 +57,19 @@ export class TraitBuilder< ) } + extendAbstract< + A extends Abstract + >( + abstract: (Super: AbstractClass) => AbstractClass + ) { + return new TraitBuilder( + this.traitSuperExpression, + {} as A, + this.traitStaticAbstract, + this.traitApply, + ) + } + implement< ImplClassWithAbstract extends ( Class & diff --git a/src/tests.ts b/src/tests.ts index 914ef53..688a352 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -28,14 +28,22 @@ const Identifiable = () => trait .build() const StatefulSubscription = trait - .abstract<{ - readonly isStatefulSubscription: true - readonly status: ( + // .abstract<{ + // readonly isStatefulSubscription: true + // readonly status: ( + // { _tag: "awaitingPayment" } | + // { _tag: "active", activeSince: Date, expiresAt?: Date } | + // { _tag: "expired", expiredSince: Date } + // ) + // }>() + .extendAbstract(Super => class extends Super { + readonly isStatefulSubscription!: true + readonly status!: ( { _tag: "awaitingPayment" } | { _tag: "active", activeSince: Date, expiresAt?: Date } | { _tag: "expired", expiredSince: Date } ) - }>() + }) .build() type StatefulSubscriptionClass = Trait.Class