From c1f48b9bb25b46e73d1f2139b0e9528d66746324 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sat, 17 Feb 2024 21:23:08 +0100 Subject: [PATCH] TraitBuilder work --- src/TraitBuilder.ts | 40 +++++++--------------------------------- src/TraitExpression.ts | 6 +++--- src/tests.ts | 36 +++++++++--------------------------- 3 files changed, 19 insertions(+), 63 deletions(-) diff --git a/src/TraitBuilder.ts b/src/TraitBuilder.ts index 5f1d124..28b242f 100644 --- a/src/TraitBuilder.ts +++ b/src/TraitBuilder.ts @@ -74,50 +74,24 @@ export class TraitBuilder< private readonly traitApply: (Super: AbstractClass) => ImplClass, ) {} - abstract>() { + abstract( + _: (Super: AbstractClass) => AbstractClass + ) { return new TraitBuilder( this.traitSuperExpression, - {} as A, + {} as Simplify, this.traitStaticAbstract, this.traitApply, ) } - extendAbstract>( - _: ( - Super: AbstractClass< - ExtendAbstractSuper - > - ) => AbstractClass - ) { - return new TraitBuilder( - this.traitSuperExpression, - {} as A, - this.traitStaticAbstract, - this.traitApply, - ) - } - - staticAbstract>() { - return new TraitBuilder( - this.traitSuperExpression, - this.traitAbstract, - {} as A, - this.traitApply, - ) - } - - extendStaticAbstract>( - _: ( - Super: AbstractClass< - ExtendStaticAbstractSuper - > - ) => AbstractClass + staticAbstract( + _: (Super: AbstractClass) => AbstractClass ) { return new TraitBuilder( this.traitSuperExpression, this.traitAbstract, - {} as A, + {} as Simplify, this.traitApply, ) } diff --git a/src/TraitExpression.ts b/src/TraitExpression.ts index d63eb89..d79b0c3 100644 --- a/src/TraitExpression.ts +++ b/src/TraitExpression.ts @@ -1,5 +1,5 @@ import { Fn, Pipe, Tuples } from "hotscript" -import { AbstractClass, Class } from "type-fest" +import { AbstractClass, Class, Simplify } from "type-fest" import { Trait } from "./Trait" import { TraitBuilder } from "./TraitBuilder" import { ExtendFn, ExtendPlain, SimplifyFn, StaticMembersFn } from "./util" @@ -72,8 +72,8 @@ export class TraitExpression< ) { return new TraitBuilder( this, - {} as SubtraitAbstract, - {} as SubtraitStaticAbstract, + {} as Simplify>, + {} as Simplify>, Super => class extends Super {}, ) } diff --git a/src/tests.ts b/src/tests.ts index 776bf46..bc0ad49 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -18,7 +18,9 @@ const PrintsHelloOnNew = trait type PrintsHelloOnNewClass = TraitClass const Identifiable = () => trait - .abstract<{ readonly id: ID }>() + .abstract(Super => class extends Super { + declare readonly id: ID + }) .implement(Super => class Identifiable extends Super { equals(el: Identifiable) { return this.id === el.id @@ -27,17 +29,9 @@ const Identifiable = () => trait .build() const StatefulSubscription = trait - // .abstract<{ - // readonly isStatefulSubscription: true - // readonly status: ( - // { _tag: "awaitingPayment" } | - // { _tag: "active", activeSince: Date, expiresAt?: Date } | - // { _tag: "expired", expiredSince: Date } - // ) - // }>() - .extendAbstract(Super => class StatefulSubscriptionAbstract extends Super { - readonly isStatefulSubscription!: true - readonly status!: ( + .abstract(Super => class extends Super { + declare readonly isStatefulSubscription: true + declare readonly status: ( { _tag: "awaitingPayment" } | { _tag: "active", activeSince: Date, expiresAt?: Date } | { _tag: "expired", expiredSince: Date } @@ -51,9 +45,9 @@ const ActiveStatefulSubscription = expression .expresses(StatefulSubscription) .build() .subtrait() - .extendAbstract(Super => class extends Super { - readonly isActiveStatefulSubscription!: true - readonly status!: { _tag: "active", activeSince: Date, expiresAt?: Date } + .abstract(Super => class extends Super { + declare readonly isActiveStatefulSubscription: true + declare readonly status: { _tag: "active", activeSince: Date, expiresAt?: Date } }) .build() @@ -86,15 +80,3 @@ class User extends exp.extends implements Implements { } console.log(new User()) - - -type MyTuple = [ - { values: { gneugneu: string } }, - { values: { ataoy: "issou" } }, -] - -type MapToValues = { - [K in keyof T]: T[K]["values"] -} - -type T = MapToValues