diff --git a/src/TraitBuilder.ts b/src/TraitBuilder.ts index a01f933..76a7b60 100644 --- a/src/TraitBuilder.ts +++ b/src/TraitBuilder.ts @@ -1,4 +1,4 @@ -import { AbstractClass, Simplify } from "type-fest" +import { AbstractClass, Class, Simplify } from "type-fest" import { Trait } from "./Trait" import { TraitExpression } from "./TraitExpression" import { Extend, StaticMembers } from "./util" @@ -128,6 +128,40 @@ export type ImplStatic< > ) +export function implStaticThis< + ImplClass extends AbstractClass & { readonly [implSuperSymbol]: true }, + This extends AbstractClass, +>( + _Impl: ImplClass, + thisArg: This, +) { + return thisArg as unknown as ( + AbstractClass< + InstanceType & InstanceType, + ConstructorParameters + > & + ImplStatic & + StaticMembers + ) +} + +export function implStaticInstantiableThis< + ImplClass extends AbstractClass & { readonly [implSuperSymbol]: true }, + This extends Class, +>( + _Impl: ImplClass, + thisArg: This, +) { + return thisArg as unknown as ( + Class< + InstanceType & InstanceType, + ConstructorParameters + > & + ImplStatic & + StaticMembers + ) +} + export const trait = new TraitBuilder( new TraitExpression(TraitExpression.NullSuperclass, []), diff --git a/src/lib.ts b/src/lib.ts index 3e9f23b..a96aa6a 100644 --- a/src/lib.ts +++ b/src/lib.ts @@ -1,4 +1,4 @@ export { Trait, TraitClass, TraitConcreteClass, TraitInstance, TraitStaticMembers, TraitTuple } from "./Trait" -export { ImplStatic, TraitBuilder, trait } from "./TraitBuilder" +export { ImplStatic, TraitBuilder, implStaticInstantiableThis, implStaticThis, trait } from "./TraitBuilder" export { Implements, StaticImplements, TraitExpression, TraitExpressionClass, TraitExpressionConcreteClass, TraitExpressionInstance, TraitExpressionStaticMembers } from "./TraitExpression" export { TraitExpressionBuilder, expression } from "./TraitExpressionBuilder"