diff --git a/src/expresses.ts b/src/expresses.ts index 189b81e..716e76b 100644 --- a/src/expresses.ts +++ b/src/expresses.ts @@ -1,7 +1,7 @@ -import { Call, Fn, Pipe, Tuples } from "hotscript" -import { AbstractClass, Opaque, Simplify } from "type-fest" -import { Trait, TraitAbstractMembersFn, TraitApplierSuperTag, TraitImplInstanceFn } from "." -import { ExtendFn } from "./util" +import { Call, Pipe, Tuples } from "hotscript" +import { AbstractClass, Opaque } from "type-fest" +import { Trait, TraitAbstractMembersFn, TraitApplierSuperTag, TraitImplClassFn, TraitImplInstanceFn } from "." +import { ExtendFn, SimplifyFn, StaticMembersFn } from "./util" class TraitsExpression< @@ -15,26 +15,34 @@ class TraitsExpression< extends(): ( AbstractClass< - Call, ...Call, Traits>, + ], [ + ExtendFn, + SimplifyFn, ]>, ConstructorParameters - > + > & + + Pipe<[ + Super, + ...Call, Traits>, + ], [ + Tuples.Map, + ExtendFn, + SimplifyFn, + ]> ) { return this.traits.reduce( (previous, trait) => trait.apply(previous), this.superclass as Opaque, - ) + ) as any } } -interface SimplifyFn extends Fn { - return: Simplify -} - export type Implements> = ( Exp extends TraitsExpression ? Pipe -class User implements Implements { +class User extends exp.extends() implements Implements { id: bigint = -1n } + +new User().id diff --git a/src/util/class.ts b/src/util/class.ts index 325aba5..d8030d7 100644 --- a/src/util/class.ts +++ b/src/util/class.ts @@ -1,3 +1,4 @@ +import { Fn } from "hotscript" import { AbstractClass } from "type-fest" @@ -37,6 +38,10 @@ export type StaticMembers> = ( Omit ) +export interface StaticMembersFn extends Fn { + return: StaticMembers +} + /** * Represents an array of static members corresponding to the provided classes. * @template Classes - An array of classes extending AbstractClass. diff --git a/src/util/index.ts b/src/util/index.ts index bf58ac1..c0b49af 100644 --- a/src/util/index.ts +++ b/src/util/index.ts @@ -1,3 +1,4 @@ export * from "./class" export * from "./extend" export * from "./inheritance" +export * from "./misc" diff --git a/src/util/misc.ts b/src/util/misc.ts new file mode 100644 index 0000000..d67c57e --- /dev/null +++ b/src/util/misc.ts @@ -0,0 +1,7 @@ +import { Fn } from "hotscript" +import { Simplify } from "type-fest" + + +export interface SimplifyFn extends Fn { + return: Simplify +}