Trait applier
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
Julien Valverdé
2023-12-28 18:23:22 +01:00
parent 5a706149ea
commit b7f31e62a4

View File

@@ -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<C> = Pick<C, keyof C>
export type Trait< export type Trait<
C extends AbstractClass<any, any> C extends AbstractClass<any>
> = Opaque< > = Opaque<
(Parent: AbstractClass<any, any[]>) => C, TraitApplier<C>,
"Trait" "thilatrait/Trait"
> >
export type GetTraitC<T> = export type TraitApplier<
C extends AbstractClass<any>
> =
(Parent: AbstractConstructor<any>) => C
export type UnwrapTraitC<T> =
T extends Trait<infer C> T extends Trait<infer C>
? C ? C
: never : never
export function trait< export function trait<
C extends AbstractClass<any, any[]> C extends AbstractClass<any>
>( >(
trait: (Parent: AbstractClass<any, any[]>) => C applier: TraitApplier<C>
) { ) {
return trait as Trait<C> return applier as Trait<C>
} }
@@ -48,7 +53,7 @@ export function extendsAndExpresses<
InstanceType<C> & InstanceType<C> &
UnionToIntersection< UnionToIntersection<
InstanceType< InstanceType<
GetTraitC< UnwrapTraitC<
Traits[number] Traits[number]
> >
> >
@@ -60,7 +65,7 @@ export function extendsAndExpresses<
StaticMembers<C> & StaticMembers<C> &
StaticMembers< StaticMembers<
UnionToIntersection< UnionToIntersection<
GetTraitC< UnwrapTraitC<
Traits[number] Traits[number]
> >
> >