diff --git a/src/Trait.ts b/src/Trait.ts index 5127d69..8e0d198 100644 --- a/src/Trait.ts +++ b/src/Trait.ts @@ -9,7 +9,7 @@ export type AddAbstractToImplClass< Abstract extends {}, > = ( Class< - InstanceType & Abstract, + Abstract & InstanceType, ConstructorParameters > & StaticMembers diff --git a/src/TraitExpression.ts b/src/TraitExpression.ts index 6f02ec7..9bbdbb2 100644 --- a/src/TraitExpression.ts +++ b/src/TraitExpression.ts @@ -4,11 +4,11 @@ import { AbstractTag, RemoveAbstractFromImplClass, Trait, TraitApplierSuperTag } import { ExtendFn, SimplifyFn, StaticMembersFn } from "./util" -type RemoveSupertraitsAbstractFromAbstract = { - [Key in Extract]: Left[Key] -} & { - [Key in Exclude]: Left[Key] -} +// type RemoveSupertraitsAbstractFromAbstract = { +// [Key in Extract]: Left[Key] +// } & { +// [Key in Exclude]: Left[Key] +// } export class TraitExpression< @@ -61,7 +61,8 @@ export class TraitExpression< ) { return new Trait( this, - {} as RemoveSupertraitsAbstractFromAbstract>, + // {} as RemoveSupertraitsAbstractFromAbstract>, + {} as SubtraitAbstract, // TODO: find a way to cleanly substract Implements from this. apply as any as (Super: AbstractClass<{}>) => RemoveAbstractFromImplClass, ) } diff --git a/src/tests.ts b/src/tests.ts index e80c955..c285337 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -63,25 +63,16 @@ const exp = expression PrintsHelloOnNew, Identifiable(), // Identifiable(), - StatefulSubscription, + ActiveStatefulSubscription, ) .build() type Abs = Implements -// exp.subtrait( -// s => { -// interface Subtrait extends (typeof s) { - -// } - -// return abstract() -// }, -// ) - class User extends exp.extends implements Implements { readonly isStatefulSubscription: true = true - declare status: { _tag: "awaitingPayment" } | { _tag: "active"; activeSince: Date; expiresAt?: Date | undefined } | { _tag: "expired"; expiredSince: Date } + readonly isActiveStatefulSubscription: true = true + declare status: { _tag: "active"; activeSince: Date; expiresAt?: Date | undefined } id: bigint = -1n } diff --git a/src/util/class.ts b/src/util/class.ts deleted file mode 100644 index 45215e0..0000000 --- a/src/util/class.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Fn } from "hotscript" -import { AbstractClass } from "type-fest" - - -/** - * Represents the static members of a class. - * @template Class - A class extending AbstractClass. - */ -export type StaticMembers> = ( - Omit -) - -export interface StaticMembersFn extends Fn { - return: StaticMembers -} diff --git a/src/util/index.ts b/src/util/index.ts index c0b49af..720a972 100644 --- a/src/util/index.ts +++ b/src/util/index.ts @@ -1,4 +1,3 @@ -export * from "./class" export * from "./extend" export * from "./inheritance" export * from "./misc" diff --git a/src/util/misc.ts b/src/util/misc.ts index eee119a..3e19396 100644 --- a/src/util/misc.ts +++ b/src/util/misc.ts @@ -1,5 +1,5 @@ import { Fn } from "hotscript" -import { Simplify } from "type-fest" +import { AbstractClass, Simplify } from "type-fest" /** @@ -9,10 +9,17 @@ import { Simplify } from "type-fest" */ export type CommonKeys = Extract -export type KeysOnlyInLeft = { - [K in Exclude]: Left[K] -} - export interface SimplifyFn extends Fn { return: Simplify } + +/** + * Represents the static members of a class. + * @template Class - A class extending AbstractClass. + */ +export type StaticMembers> = ( + Omit +) +export interface StaticMembersFn extends Fn { + return: StaticMembers +}