diff --git a/src/trait-inheritance.ts b/src/trait-inheritance.ts index dc0c5a7..eb7a3dd 100644 --- a/src/trait-inheritance.ts +++ b/src/trait-inheritance.ts @@ -1,4 +1,4 @@ -import { AbstractClass, Opaque, UnionToIntersection } from "type-fest" +import { AbstractClass, AbstractConstructor, Opaque, UnionToIntersection } from "type-fest" /** @@ -11,24 +11,29 @@ export type StaticMembers = Pick export type Trait< - C extends AbstractClass + C extends AbstractClass > = Opaque< - (Parent: AbstractClass) => C, - "Trait" + TraitApplier, + "thilatrait/Trait" > -export type GetTraitC = +export type TraitApplier< + C extends AbstractClass +> = + (Parent: AbstractConstructor) => C + +export type UnwrapTraitC = T extends Trait ? C : never export function trait< - C extends AbstractClass + C extends AbstractClass >( - trait: (Parent: AbstractClass) => C + applier: TraitApplier ) { - return trait as Trait + return applier as Trait } @@ -48,7 +53,7 @@ export function extendsAndExpresses< InstanceType & UnionToIntersection< InstanceType< - GetTraitC< + UnwrapTraitC< Traits[number] > > @@ -60,7 +65,7 @@ export function extendsAndExpresses< StaticMembers & StaticMembers< UnionToIntersection< - GetTraitC< + UnwrapTraitC< Traits[number] > >