First version: 20231229.0.0 #2

Merged
Thilawyn merged 21 commits from next into master 2023-12-29 01:07:07 +01:00
Showing only changes of commit b7f31e62a4 - Show all commits

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<
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]
>
>