Trait refactoring
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
import { Simplify } from "type-fest"
|
||||
import { TraitAbstractMembers, TraitClass, TraitImpl, TraitImplInstance, TraitInstance, expresses, trait } from "."
|
||||
import { TraitImplInstance, expresses, trait } from "."
|
||||
|
||||
|
||||
const PrintsHelloOnNew = trait()(Super =>
|
||||
|
||||
49
src/trait.ts
49
src/trait.ts
@@ -13,12 +13,23 @@ type AddAbstractMembersToImpl<
|
||||
StaticMembers<Impl>
|
||||
)
|
||||
|
||||
type RemoveAbstractMembersFromImplInstance<
|
||||
ImplInstanceWithAbstractMembers extends AbstractMembers,
|
||||
AbstractMembers extends object,
|
||||
> = (
|
||||
Omit<ImplInstanceWithAbstractMembers, keyof AbstractMembers>
|
||||
)
|
||||
|
||||
type RemoveAbstractMembersFromImpl<
|
||||
ImplWithAbstractMembers extends Class<AbstractMembers, []>,
|
||||
AbstractMembers extends object,
|
||||
> = (
|
||||
Class<
|
||||
Omit<InstanceType<ImplWithAbstractMembers>, keyof AbstractMembers>,
|
||||
RemoveAbstractMembersFromImplInstance<
|
||||
InstanceType<ImplWithAbstractMembers>,
|
||||
AbstractMembers
|
||||
>,
|
||||
|
||||
ConstructorParameters<ImplWithAbstractMembers>
|
||||
> &
|
||||
StaticMembers<ImplWithAbstractMembers>
|
||||
@@ -29,15 +40,12 @@ export type TraitTag = "@thilawyn/traitify-ts/Trait"
|
||||
|
||||
export type Trait<
|
||||
AbstractMembers extends object,
|
||||
Impl extends Class<object, []>,
|
||||
ImplWithAbstractMembers extends Class<AbstractMembers, []>,
|
||||
> = (
|
||||
Opaque<{
|
||||
readonly apply: TraitApplier<
|
||||
AbstractMembers,
|
||||
AddAbstractMembersToImpl<
|
||||
Impl,
|
||||
AbstractMembers
|
||||
>
|
||||
ImplWithAbstractMembers
|
||||
>
|
||||
}, TraitTag>
|
||||
)
|
||||
@@ -48,27 +56,33 @@ export type TraitAbstractMembers<T> = (
|
||||
: never
|
||||
)
|
||||
|
||||
export type TraitImpl<T> = (
|
||||
T extends Trait<any, infer Impl>
|
||||
? Impl
|
||||
export type TraitImplClass<T> = (
|
||||
T extends Trait<infer AbstractMembers, infer ImplWithAbstractMembers>
|
||||
? RemoveAbstractMembersFromImpl<
|
||||
ImplWithAbstractMembers,
|
||||
AbstractMembers
|
||||
>
|
||||
: never
|
||||
)
|
||||
|
||||
export type TraitImplInstance<T> = (
|
||||
T extends Trait<any, infer Impl>
|
||||
? InstanceType<Impl>
|
||||
T extends Trait<infer AbstractMembers, infer ImplWithAbstractMembers>
|
||||
? RemoveAbstractMembersFromImplInstance<
|
||||
InstanceType<ImplWithAbstractMembers>,
|
||||
AbstractMembers
|
||||
>
|
||||
: never
|
||||
)
|
||||
|
||||
export type TraitClass<T> = (
|
||||
T extends Trait<infer AbstractMembers, infer Impl>
|
||||
? AddAbstractMembersToImpl<Impl, AbstractMembers>
|
||||
T extends Trait<any, infer ImplWithAbstractMembers>
|
||||
? ImplWithAbstractMembers
|
||||
: never
|
||||
)
|
||||
|
||||
export type TraitInstance<T> = (
|
||||
T extends Trait<infer AbstractMembers, infer Impl>
|
||||
? InstanceType<Impl> & AbstractMembers
|
||||
T extends Trait<any, infer ImplWithAbstractMembers>
|
||||
? InstanceType<ImplWithAbstractMembers>
|
||||
: never
|
||||
)
|
||||
|
||||
@@ -91,10 +105,7 @@ export function trait<
|
||||
apply: TraitApplier<AbstractMembers, ImplWithAbstractMembers>
|
||||
) => Trait<
|
||||
AbstractMembers,
|
||||
RemoveAbstractMembersFromImpl<
|
||||
ImplWithAbstractMembers,
|
||||
AbstractMembers
|
||||
>
|
||||
ImplWithAbstractMembers
|
||||
>
|
||||
) {
|
||||
return apply => ({ apply }) as any
|
||||
|
||||
Reference in New Issue
Block a user