From df7e7f3401d345af1615151a0c074d90185ba0f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 19 Feb 2024 22:08:24 +0100 Subject: [PATCH] Fixed TraitExpressionBuilder --- src/Trait.ts | 48 +++++++++++++++++++++----------- src/TraitExpression.ts | 20 ++------------ src/TraitExpressionBuilder.ts | 52 +++++++++++++---------------------- src/tests.ts | 3 +- src/util/extend.ts | 7 ++--- 5 files changed, 59 insertions(+), 71 deletions(-) diff --git a/src/Trait.ts b/src/Trait.ts index c98c2c6..2ad5dff 100644 --- a/src/Trait.ts +++ b/src/Trait.ts @@ -1,6 +1,6 @@ import { AbstractClass, Class, Simplify } from "type-fest" import { TraitExpression } from "./TraitExpression" -import { Extend, StaticMembers } from "./util" +import { Extend, StaticMembers as StaticMembersUtil } from "./util" export class Trait< @@ -27,6 +27,10 @@ export namespace Trait { : never ) + export type Supertraits = ( + TraitExpression.Traits> + ) + export type Abstract = ( T extends Trait ? Abstract @@ -50,11 +54,21 @@ export namespace Trait { ) export type ImplStaticMembers = ( - StaticMembers> + StaticMembersUtil> ) - export type Supertraits = ( - TraitExpression.Traits> + export type Instance = ( + Extend<[ + Trait.Abstract, + Trait.ImplInstance, + ]> + ) + + export type StaticMembers = ( + Extend<[ + Trait.StaticAbstract, + Trait.ImplStaticMembers, + ]> ) } @@ -88,6 +102,18 @@ export namespace TraitTuple { ? T[K] : Trait.ImplStaticMembers } + + export type MapInstance = { + [K in keyof T]: K extends keyof [] + ? T[K] + : Trait.Instance + } + + export type MapStaticMembers = { + [K in keyof T]: K extends keyof [] + ? T[K] + : Trait.StaticMembers + } } @@ -102,19 +128,9 @@ export type TraitConcreteClass> = ( ) export type TraitInstance> = ( - Simplify< - Extend<[ - Trait.Abstract, - Trait.ImplInstance, - ]> - > + Simplify> ) export type TraitStaticMembers> = ( - Simplify< - Extend<[ - Trait.StaticAbstract, - Trait.ImplStaticMembers, - ]> - > + Simplify> ) diff --git a/src/TraitExpression.ts b/src/TraitExpression.ts index 733fdc9..179839a 100644 --- a/src/TraitExpression.ts +++ b/src/TraitExpression.ts @@ -1,5 +1,5 @@ import { AbstractClass, Class, Simplify } from "type-fest" -import { Trait, TraitInstance, TraitStaticMembers, TraitTuple } from "./Trait" +import { Trait, TraitTuple } from "./Trait" import { TraitBuilder } from "./TraitBuilder" import { Extend, StaticMembers } from "./util" @@ -143,17 +143,10 @@ export type TraitExpressionInstance< Simplify< Extend<[ InstanceType>, - ...MapTraitsInstance>, + ...TraitTuple.MapInstance>, ]> > ) -type MapTraitsInstance = { - [K in keyof T]: K extends keyof [] - ? T[K] - : T[K] extends Trait - ? TraitInstance - : never -} export type TraitExpressionStaticMembers< Exp extends TraitExpression[]> @@ -161,14 +154,7 @@ export type TraitExpressionStaticMembers< Simplify< Extend<[ StaticMembers>, - ...MapTraitsStaticMembers>, + ...TraitTuple.MapStaticMembers>, ]> > ) -type MapTraitsStaticMembers = { - [K in keyof T]: K extends keyof [] - ? T[K] - : T[K] extends Trait - ? TraitStaticMembers - : never -} diff --git a/src/TraitExpressionBuilder.ts b/src/TraitExpressionBuilder.ts index b6b35a6..11bbe5d 100644 --- a/src/TraitExpressionBuilder.ts +++ b/src/TraitExpressionBuilder.ts @@ -1,9 +1,9 @@ -import { Call, Fn, Pipe, Tuples } from "hotscript" +import { Call, Fn, Tuples } from "hotscript" import { uniq } from "lodash-es" import { AbstractClass } from "type-fest" -import { Trait } from "./Trait" +import { Trait, TraitTuple } from "./Trait" import { TraitExpression } from "./TraitExpression" -import { ExtendableFn, StaticMembersFn } from "./util" +import { Extendable, StaticMembers } from "./util" type SpreadSupertraits[]> = ( @@ -17,49 +17,35 @@ interface PrependTraitSupertraitsFn extends Fn { } -type AbstractMembersExtendable< - Superclass extends AbstractClass<{}>, +type InstanceExtendable< + Superclass extends AbstractClass, Traits extends Trait[], > = ( - Pipe, - Tuples.Prepend>, + Extendable<[ + InstanceType, + ...TraitTuple.MapInstance, ]> ) -type ImplInstanceExtendable< - Superclass extends AbstractClass<{}>, +type StaticMembersExtendable< + Superclass extends AbstractClass, Traits extends Trait[], > = ( - Pipe, - Tuples.Prepend>, - ]> -) - -type ImplStaticMembersExtendable< - Superclass extends AbstractClass<{}>, - Traits extends Trait[], -> = ( - Pipe, - Tuples.Prepend, - Tuples.Map, - ExtendableFn, + Extendable<[ + StaticMembers, + ...TraitTuple.MapStaticMembers, ]> ) type BuildTraitExpression< - Superclass extends AbstractClass<{}>, + Superclass extends AbstractClass, Traits extends Trait[], > = ( - AbstractMembersExtendable extends false - ? "Type conflict between the traits abstract members and/or the superclass instance." - : ImplInstanceExtendable extends false - ? "Type conflict between the traits implementation instances and/or the superclass instance." - : ImplStaticMembersExtendable extends false - ? "Type conflict between the traits implementation static members and/or the superclass static members." - : TraitExpression + InstanceExtendable extends false + ? "Type conflict on the instance side." + : StaticMembersExtendable extends false + ? "Type conflict on the static side." + : TraitExpression ) diff --git a/src/tests.ts b/src/tests.ts index 51641af..b7ada34 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -1,3 +1,4 @@ +import { Simplify } from "type-fest" import { TraitClass } from "./Trait" import { trait } from "./TraitBuilder" import { Implements, ImplementsStatic, TraitExpressionClass } from "./TraitExpression" @@ -85,6 +86,6 @@ console.log(new User()) type T = NonExtendableKeys<[ - { prout: string }, { prout: "gneugneu" }, + { prout: string }, ]> diff --git a/src/util/extend.ts b/src/util/extend.ts index 6f1c498..6383bde 100644 --- a/src/util/extend.ts +++ b/src/util/extend.ts @@ -58,10 +58,9 @@ export type NonExtendableKeys = ( infer Self extends object, ...infer Rest extends object[], ] - ? { - [K in keyof Super & keyof Self]: Self[K] extends Super[K] - ? never - : K + ? {[K in keyof Super & keyof Self]: Self[K] extends Super[K] + ? never + : K }[keyof Super & keyof Self] | NonExtendableKeys<[ Super & Self,