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<
|
||||
C extends AbstractClass<any, any>
|
||||
C extends AbstractClass<any>
|
||||
> = Opaque<
|
||||
(Parent: AbstractClass<any, any[]>) => C,
|
||||
"Trait"
|
||||
TraitApplier<C>,
|
||||
"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>
|
||||
? C
|
||||
: never
|
||||
|
||||
|
||||
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> &
|
||||
UnionToIntersection<
|
||||
InstanceType<
|
||||
GetTraitC<
|
||||
UnwrapTraitC<
|
||||
Traits[number]
|
||||
>
|
||||
>
|
||||
@@ -60,7 +65,7 @@ export function extendsAndExpresses<
|
||||
StaticMembers<C> &
|
||||
StaticMembers<
|
||||
UnionToIntersection<
|
||||
GetTraitC<
|
||||
UnwrapTraitC<
|
||||
Traits[number]
|
||||
>
|
||||
>
|
||||
|
||||
Reference in New Issue
Block a user