This commit is contained in:
@@ -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]
|
||||||
>
|
>
|
||||||
>
|
>
|
||||||
|
|||||||
Reference in New Issue
Block a user