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