Trait work

This commit is contained in:
Julien Valverdé
2024-01-28 20:16:10 +01:00
parent f5ab00c34a
commit e46f78d93e
2 changed files with 23 additions and 134 deletions

View File

@@ -2,6 +2,17 @@ import { AbstractClass, Class, Opaque } from "type-fest"
import { StaticMembers } from "./util"
type AddAbstractMembersToImpl<
Impl extends Class<object, []>,
AbstractMembers extends object,
> = (
Class<
InstanceType<Impl> & AbstractMembers,
ConstructorParameters<Impl>
> &
StaticMembers<Impl>
)
type RemoveAbstractMembersFromImpl<
ImplWithAbstractMembers extends Class<AbstractMembers, []>,
AbstractMembers extends object,
@@ -18,11 +29,16 @@ export type TraitTag = "@thilawyn/traitify-ts/Trait"
export type Trait<
AbstractMembers extends object,
Impl extends Class<any, []>,
Impl extends Class<object, []>,
> = (
Opaque<{
readonly AbstractMembers: AbstractMembers
readonly Impl: Impl
readonly apply: TraitApplier<
AbstractMembers,
AddAbstractMembersToImpl<
Impl,
AbstractMembers
>
>
}, TraitTag>
)
@@ -43,7 +59,7 @@ export function trait<
AbstractMembers extends object = {}
>(): (
<ImplWithAbstractMembers extends Class<AbstractMembers, []>>(
applier: TraitApplier<AbstractMembers, ImplWithAbstractMembers>
apply: TraitApplier<AbstractMembers, ImplWithAbstractMembers>
) => Trait<
AbstractMembers,
RemoveAbstractMembersFromImpl<
@@ -52,5 +68,5 @@ export function trait<
>
>
) {
return (applier) => applier()
return apply => ({ apply }) as any
}