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