0.1.0 #1
33
src/trait.ts
33
src/trait.ts
@@ -3,7 +3,7 @@ import { AbstractClass, Class, Opaque } from "type-fest"
|
|||||||
import { StaticMembers } from "./util"
|
import { StaticMembers } from "./util"
|
||||||
|
|
||||||
|
|
||||||
type AddAbstractToImplClass<
|
type AddAbstractToImpl<
|
||||||
Impl extends Class<object, []>,
|
Impl extends Class<object, []>,
|
||||||
Abstract extends object,
|
Abstract extends object,
|
||||||
> = (
|
> = (
|
||||||
@@ -14,26 +14,15 @@ type AddAbstractToImplClass<
|
|||||||
StaticMembers<Impl>
|
StaticMembers<Impl>
|
||||||
)
|
)
|
||||||
|
|
||||||
type RemoveAbstractFromImplInstance<
|
type RemoveAbstractFromImpl<
|
||||||
ImplInstanceWithAbstractMembers extends AbstractMembers,
|
ImplWithAbstract extends Class<Abstract, []>,
|
||||||
AbstractMembers extends object,
|
Abstract extends object,
|
||||||
> = (
|
|
||||||
Omit<ImplInstanceWithAbstractMembers, keyof AbstractMembers>
|
|
||||||
)
|
|
||||||
|
|
||||||
type RemoveAbstractFromImplClass<
|
|
||||||
ImplWithAbstractMembers extends Class<AbstractMembers, []>,
|
|
||||||
AbstractMembers extends object,
|
|
||||||
> = (
|
> = (
|
||||||
Class<
|
Class<
|
||||||
RemoveAbstractFromImplInstance<
|
Omit<InstanceType<ImplWithAbstract>, keyof Abstract>,
|
||||||
InstanceType<ImplWithAbstractMembers>,
|
ConstructorParameters<ImplWithAbstract>
|
||||||
AbstractMembers
|
|
||||||
>,
|
|
||||||
|
|
||||||
ConstructorParameters<ImplWithAbstractMembers>
|
|
||||||
> &
|
> &
|
||||||
StaticMembers<ImplWithAbstractMembers>
|
StaticMembers<ImplWithAbstract>
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@@ -46,7 +35,7 @@ export type Trait<
|
|||||||
Opaque<{
|
Opaque<{
|
||||||
readonly apply: TraitApplier<
|
readonly apply: TraitApplier<
|
||||||
Abstract,
|
Abstract,
|
||||||
AddAbstractToImplClass<Impl, Abstract>
|
AddAbstractToImpl<Impl, Abstract>
|
||||||
>
|
>
|
||||||
}, TraitTag>
|
}, TraitTag>
|
||||||
)
|
)
|
||||||
@@ -83,7 +72,7 @@ export interface TraitImplInstanceFn extends Fn {
|
|||||||
|
|
||||||
export type TraitClass<T> = (
|
export type TraitClass<T> = (
|
||||||
T extends Trait<infer Abstract, infer Impl>
|
T extends Trait<infer Abstract, infer Impl>
|
||||||
? AddAbstractToImplClass<Impl, Abstract>
|
? AddAbstractToImpl<Impl, Abstract>
|
||||||
: never
|
: never
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -94,7 +83,7 @@ export interface TraitClassFn extends Fn {
|
|||||||
export type TraitInstance<T> = (
|
export type TraitInstance<T> = (
|
||||||
T extends Trait<infer Abstract, infer Impl>
|
T extends Trait<infer Abstract, infer Impl>
|
||||||
? InstanceType<
|
? InstanceType<
|
||||||
AddAbstractToImplClass<Impl, Abstract>
|
AddAbstractToImpl<Impl, Abstract>
|
||||||
>
|
>
|
||||||
: never
|
: never
|
||||||
)
|
)
|
||||||
@@ -122,7 +111,7 @@ export function trait<
|
|||||||
apply: TraitApplier<Abstract, ImplWithAbstract>
|
apply: TraitApplier<Abstract, ImplWithAbstract>
|
||||||
) => Trait<
|
) => Trait<
|
||||||
Abstract,
|
Abstract,
|
||||||
RemoveAbstractFromImplClass<ImplWithAbstract, Abstract>
|
RemoveAbstractFromImpl<ImplWithAbstract, Abstract>
|
||||||
>
|
>
|
||||||
) {
|
) {
|
||||||
return apply => ({ apply }) as any
|
return apply => ({ apply }) as any
|
||||||
|
|||||||
Reference in New Issue
Block a user