Trait work
This commit is contained in:
26
src/trait.ts
26
src/trait.ts
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user