From 04146f6c6963b97ee924420189873549ab19ba82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sat, 17 Feb 2024 17:12:46 +0100 Subject: [PATCH] SubtraitAbstract --- src/TraitExpression.ts | 29 ++++++++++++++++++++++++++--- src/util/extend.ts | 20 ++++++++++++-------- 2 files changed, 38 insertions(+), 11 deletions(-) diff --git a/src/TraitExpression.ts b/src/TraitExpression.ts index b631dbc..d63eb89 100644 --- a/src/TraitExpression.ts +++ b/src/TraitExpression.ts @@ -2,7 +2,30 @@ import { Fn, Pipe, Tuples } from "hotscript" import { AbstractClass, Class } from "type-fest" import { Trait } from "./Trait" import { TraitBuilder } from "./TraitBuilder" -import { ExtendFn, SimplifyFn, StaticMembersFn } from "./util" +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< @@ -49,8 +72,8 @@ export class TraitExpression< ) { return new TraitBuilder( this, - {}, - {}, + {} as SubtraitAbstract, + {} as SubtraitStaticAbstract, Super => class extends Super {}, ) } diff --git a/src/util/extend.ts b/src/util/extend.ts index 0b162d1..2592f09 100644 --- a/src/util/extend.ts +++ b/src/util/extend.ts @@ -15,17 +15,21 @@ export type ExtendFn = Tuples.Reduce export type Extend = Call -export type ExtendPlain = ( +export type ExtendPlain = ( T extends [infer Super, infer Self, ...infer Rest] - ? Pick> extends Pick> - ? ExtendPlain<[ - Omit> & Self, - ...Rest, - ]> + ? Rest extends object[] + ? Pick> extends Pick> + ? ExtendPlain<[ + Omit> & Self, + ...Rest, + ]> + : never : never : T extends [infer Self] - ? Self - : void + ? Self extends object + ? Self + : never + : {} )