From 33275ae63eacb9156c6cb13f0cd80b24dc94e4ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 4 Feb 2024 23:59:12 +0100 Subject: [PATCH] Work --- src/Trait.ts | 21 +++++++++++++------ src/TraitExpressionBuilder.ts | 38 ++++++++++++++++------------------- src/tests.ts | 2 +- 3 files changed, 33 insertions(+), 28 deletions(-) diff --git a/src/Trait.ts b/src/Trait.ts index 24cd8f4..3637455 100644 --- a/src/Trait.ts +++ b/src/Trait.ts @@ -28,18 +28,27 @@ type RemoveAbstractFromImplClass< export class Trait< - Super extends TraitExpression[], Trait[]>, - Abstract extends {}, - ImplClass extends Class<{}, []>, + Supertraits extends TraitExpression[], Trait[]>, + Abstract extends {}, + ImplClass extends Class<{}, []>, > { constructor( - readonly supertraits: Super, + readonly supertraits: Supertraits, readonly abstract: Abstract, readonly apply: (Super: AbstractClass<{}>) => ImplClass, ) {} } export namespace Trait { + export type OwnSupertraits = ( + T extends Trait + ? Supertraits + : never + ) + export interface OwnSupertraitsFn extends Fn { + return: Trait.OwnSupertraits + } + export type OwnAbstract = ( T extends Trait ? Abstract @@ -88,8 +97,8 @@ export namespace Trait { } export type Supertraits = ( - T extends Trait - ? TraitExpression.AllTraits + T extends Trait + ? TraitExpression.AllTraits : never ) export interface SupertraitsFn extends Fn { diff --git a/src/TraitExpressionBuilder.ts b/src/TraitExpressionBuilder.ts index 0af24ff..a6c39a5 100644 --- a/src/TraitExpressionBuilder.ts +++ b/src/TraitExpressionBuilder.ts @@ -73,40 +73,36 @@ type SpreadSupertraits[]> = ( > ) interface PrependTraitSupertraitsFn extends Fn { - return: this["arg0"] extends Trait - ? Super extends TraitExpression - ? [...AllTraits, this["arg0"]] - : never - : never + return: [...Trait.Supertraits, this["arg0"]] } type AbstractMembersExtendable< - Super extends AbstractClass<{}>, - Traits extends Trait[], + Superclass extends AbstractClass<{}>, + Traits extends Trait[], > = ( Call, + InstanceType, ...Call, Traits>, ]> ) type ImplInstanceExtendable< - Super extends AbstractClass<{}>, - Traits extends Trait[], + Superclass extends AbstractClass<{}>, + Traits extends Trait[], > = ( Call, + InstanceType, ...Call, Traits>, ]> ) type ImplStaticMembersExtendable< - Super extends AbstractClass<{}>, - Traits extends Trait[], + Superclass extends AbstractClass<{}>, + Traits extends Trait[], > = ( Pipe<[ - Super, + Superclass, ...Call, Traits>, ], [ Tuples.Map, @@ -115,19 +111,19 @@ type ImplStaticMembersExtendable< ) type GetTraitExpression< - Super extends AbstractClass<{}>, - OwnTraits extends Trait[], - AllTraits extends Trait[], + Superclass extends AbstractClass<{}>, + OwnTraits extends Trait[], + AllTraits extends Trait[], > = ( Call extends true ? "Cannot express an empty list of traits." - : AbstractMembersExtendable extends false + : AbstractMembersExtendable extends false ? "Type conflict between the traits abstract members and/or the superclass instance." - : ImplInstanceExtendable extends false + : ImplInstanceExtendable extends false ? "Type conflict between the traits implementation instances and/or the superclass instance." - : ImplStaticMembersExtendable extends false + : ImplStaticMembersExtendable extends false ? "Type conflict between the traits implementation static members and/or the superclass static members." - : TraitExpression + : TraitExpression ) diff --git a/src/tests.ts b/src/tests.ts index 1bc7e75..c0a35ca 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -57,7 +57,7 @@ const builder = expression StatefulSubscription, ) -type T = TraitExpression.OwnTraits +type T = TraitExpression.AllTraits const exp = builder.get() type Abs = Implements