From 34c91707ae610b7b9e4ecaf8732654ae9ca13cb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 19 Feb 2024 01:11:22 +0100 Subject: [PATCH] TraitExpression work --- src/Trait.ts | 14 +++++++++- src/TraitBuilder.ts | 6 ++--- src/TraitExpression.ts | 61 +++++++++++++++++++----------------------- 3 files changed, 44 insertions(+), 37 deletions(-) diff --git a/src/Trait.ts b/src/Trait.ts index 2a2cfbe..f340371 100644 --- a/src/Trait.ts +++ b/src/Trait.ts @@ -11,7 +11,7 @@ export class Trait< >, Abstract extends object, StaticAbstract extends object, - ImplClass extends Class, + ImplClass extends AbstractClass, > { constructor( readonly superExpression: SuperExpression, @@ -96,6 +96,18 @@ export namespace Trait { } export namespace Traits { + export type MapAbstract = { + [K in keyof T]: K extends keyof [] + ? T[K] + : Trait.OwnAbstract + } + + export type MapStaticAbstract = { + [K in keyof T]: K extends keyof [] + ? T[K] + : Trait.OwnStaticAbstract + } + export type MapImplClass = { [K in keyof T]: K extends keyof [] ? T[K] diff --git a/src/TraitBuilder.ts b/src/TraitBuilder.ts index 1a68621..c54c34c 100644 --- a/src/TraitBuilder.ts +++ b/src/TraitBuilder.ts @@ -1,4 +1,4 @@ -import { AbstractClass, Class, Simplify } from "type-fest" +import { AbstractClass, Simplify } from "type-fest" import { Trait, Traits } from "./Trait" import { TraitExpression } from "./TraitExpression" import { ExtendPlain, StaticMembers } from "./util" @@ -37,7 +37,7 @@ export class TraitBuilder< >, Abstract extends object, StaticAbstract extends object, - ImplClass extends Class, + ImplClass extends AbstractClass, > { constructor( private readonly traitSuperExpression: SuperExpression, @@ -85,7 +85,7 @@ export class TraitBuilder< this.traitStaticAbstract, apply as unknown as (Super: AbstractClass) => ( - Class< // TODO: use abstract class instead + AbstractClass< Simplify< Omit< InstanceType, diff --git a/src/TraitExpression.ts b/src/TraitExpression.ts index d79b0c3..46e912a 100644 --- a/src/TraitExpression.ts +++ b/src/TraitExpression.ts @@ -1,45 +1,22 @@ import { Fn, Pipe, Tuples } from "hotscript" import { AbstractClass, Class, Simplify } from "type-fest" -import { Trait } from "./Trait" +import { Trait, Traits } from "./Trait" import { TraitBuilder } from "./TraitBuilder" import { ExtendFn, ExtendPlain, SimplifyFn, StaticMembersFn } from "./util" -type SubtraitAbstract = ( - ExtendPlain< - MapTraitsToOwnAbstract< - TraitExpression.Traits - > - > -) -type MapTraitsToOwnAbstract = { - [K in keyof T]: Trait.OwnAbstract -} - -type SubtraitStaticAbstract = ( - ExtendPlain< - MapTraitsToOwnStaticAbstract< - TraitExpression.Traits - > - > -) -type MapTraitsToOwnStaticAbstract = { - [K in keyof T]: Trait.OwnStaticAbstract -} - - export class TraitExpression< - Superclass extends AbstractClass, - const Traits extends Trait[], + Superclass extends AbstractClass, + const T extends Trait[], > { constructor( readonly superclass: Superclass, - readonly traits: Traits, + readonly traits: T, ) {} get extends(): ( AbstractClass< - Pipe, // Map all the traits to the instance of their implementation class Tuples.Prepend>, // Add the instance of the superclass at the top of the list ExtendFn, // Reduce to a single instance that extends all the instances in the list @@ -49,7 +26,7 @@ export class TraitExpression< ConstructorParameters > & - Pipe, // Map all the traits to their implementation class Tuples.Prepend, // Add the superclass at the top of the list Tuples.Map, // Map all the classes to an object containing their static members @@ -70,11 +47,29 @@ export class TraitExpression< >( this: This ) { - return new TraitBuilder( + return new TraitBuilder< + This, + Simplify< + ExtendPlain> + >, + Simplify< + ExtendPlain> + >, + ( + AbstractClass< + Simplify< + ExtendPlain> + > + > & + Simplify< + ExtendPlain> + > + ) + >( this, - {} as Simplify>, - {} as Simplify>, - Super => class extends Super {}, + {} as any, + {} as any, + Super => class extends Super {} as any, ) } }