0.1.0 #1
@@ -54,6 +54,7 @@ const builder = expression
|
|||||||
)
|
)
|
||||||
|
|
||||||
const exp = builder.get()
|
const exp = builder.get()
|
||||||
|
type Abs = Implements<typeof exp>
|
||||||
|
|
||||||
class User extends exp.extends implements Implements<typeof exp> {
|
class User extends exp.extends implements Implements<typeof exp> {
|
||||||
id: bigint = -1n
|
id: bigint = -1n
|
||||||
|
|||||||
76
src/trait.ts
76
src/trait.ts
@@ -3,30 +3,30 @@ import { AbstractClass, Class, Opaque } from "type-fest"
|
|||||||
import { StaticMembers } from "./util"
|
import { StaticMembers } from "./util"
|
||||||
|
|
||||||
|
|
||||||
// type AddAbstractMembersToImpl<
|
type AddAbstractToImplClass<
|
||||||
// Impl extends Class<object, []>,
|
Impl extends Class<object, []>,
|
||||||
// AbstractMembers extends object,
|
Abstract extends object,
|
||||||
// > = (
|
> = (
|
||||||
// Class<
|
Class<
|
||||||
// InstanceType<Impl> & AbstractMembers,
|
InstanceType<Impl> & Abstract,
|
||||||
// ConstructorParameters<Impl>
|
ConstructorParameters<Impl>
|
||||||
// > &
|
> &
|
||||||
// StaticMembers<Impl>
|
StaticMembers<Impl>
|
||||||
// )
|
)
|
||||||
|
|
||||||
type RemoveAbstractMembersFromImplInstance<
|
type RemoveAbstractFromImplInstance<
|
||||||
ImplInstanceWithAbstractMembers extends AbstractMembers,
|
ImplInstanceWithAbstractMembers extends AbstractMembers,
|
||||||
AbstractMembers extends object,
|
AbstractMembers extends object,
|
||||||
> = (
|
> = (
|
||||||
Omit<ImplInstanceWithAbstractMembers, keyof AbstractMembers>
|
Omit<ImplInstanceWithAbstractMembers, keyof AbstractMembers>
|
||||||
)
|
)
|
||||||
|
|
||||||
type RemoveAbstractMembersFromImplClass<
|
type RemoveAbstractFromImplClass<
|
||||||
ImplWithAbstractMembers extends Class<AbstractMembers, []>,
|
ImplWithAbstractMembers extends Class<AbstractMembers, []>,
|
||||||
AbstractMembers extends object,
|
AbstractMembers extends object,
|
||||||
> = (
|
> = (
|
||||||
Class<
|
Class<
|
||||||
RemoveAbstractMembersFromImplInstance<
|
RemoveAbstractFromImplInstance<
|
||||||
InstanceType<ImplWithAbstractMembers>,
|
InstanceType<ImplWithAbstractMembers>,
|
||||||
AbstractMembers
|
AbstractMembers
|
||||||
>,
|
>,
|
||||||
@@ -40,13 +40,13 @@ type RemoveAbstractMembersFromImplClass<
|
|||||||
export type TraitTag = "@thilawyn/traitify-ts/Trait"
|
export type TraitTag = "@thilawyn/traitify-ts/Trait"
|
||||||
|
|
||||||
export type Trait<
|
export type Trait<
|
||||||
AbstractMembers extends object,
|
Abstract extends object,
|
||||||
ImplWithAbstractMembers extends Class<AbstractMembers, []>,
|
Impl extends Class<object, []>,
|
||||||
> = (
|
> = (
|
||||||
Opaque<{
|
Opaque<{
|
||||||
readonly apply: TraitApplier<
|
readonly apply: TraitApplier<
|
||||||
AbstractMembers,
|
Abstract,
|
||||||
ImplWithAbstractMembers
|
AddAbstractToImplClass<Impl, Abstract>
|
||||||
>
|
>
|
||||||
}, TraitTag>
|
}, TraitTag>
|
||||||
)
|
)
|
||||||
@@ -62,11 +62,8 @@ export interface TraitAbstractMembersFn extends Fn {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export type TraitImplClass<T> = (
|
export type TraitImplClass<T> = (
|
||||||
T extends Trait<infer AbstractMembers, infer ImplWithAbstractMembers>
|
T extends Trait<any, infer Impl>
|
||||||
? RemoveAbstractMembersFromImplClass<
|
? Impl
|
||||||
ImplWithAbstractMembers,
|
|
||||||
AbstractMembers
|
|
||||||
>
|
|
||||||
: never
|
: never
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -75,11 +72,8 @@ export interface TraitImplClassFn extends Fn {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export type TraitImplInstance<T> = (
|
export type TraitImplInstance<T> = (
|
||||||
T extends Trait<infer AbstractMembers, infer ImplWithAbstractMembers>
|
T extends Trait<any, infer Impl>
|
||||||
? RemoveAbstractMembersFromImplInstance<
|
? InstanceType<Impl>
|
||||||
InstanceType<ImplWithAbstractMembers>,
|
|
||||||
AbstractMembers
|
|
||||||
>
|
|
||||||
: never
|
: never
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -88,8 +82,8 @@ export interface TraitImplInstanceFn extends Fn {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export type TraitClass<T> = (
|
export type TraitClass<T> = (
|
||||||
T extends Trait<any, infer ImplWithAbstractMembers>
|
T extends Trait<infer Abstract, infer Impl>
|
||||||
? ImplWithAbstractMembers
|
? AddAbstractToImplClass<Impl, Abstract>
|
||||||
: never
|
: never
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -98,8 +92,10 @@ export interface TraitClassFn extends Fn {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export type TraitInstance<T> = (
|
export type TraitInstance<T> = (
|
||||||
T extends Trait<any, infer ImplWithAbstractMembers>
|
T extends Trait<infer Abstract, infer Impl>
|
||||||
? InstanceType<ImplWithAbstractMembers>
|
? InstanceType<
|
||||||
|
AddAbstractToImplClass<Impl, Abstract>
|
||||||
|
>
|
||||||
: never
|
: never
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -111,22 +107,22 @@ export interface TraitInstanceFn extends Fn {
|
|||||||
export type TraitApplierSuperTag = "@thilawyn/traitify-ts/TraitApplierSuper"
|
export type TraitApplierSuperTag = "@thilawyn/traitify-ts/TraitApplierSuper"
|
||||||
|
|
||||||
export type TraitApplier<
|
export type TraitApplier<
|
||||||
AbstractMembers extends object,
|
Abstract extends object,
|
||||||
ImplWithAbstractMembers extends Class<AbstractMembers, []>,
|
ImplWithAbstract extends Class<Abstract, []>,
|
||||||
> = (
|
> = (
|
||||||
(Super: Opaque<AbstractClass<AbstractMembers>, TraitApplierSuperTag>) => (
|
(Super: Opaque<AbstractClass<Abstract>, TraitApplierSuperTag>) => (
|
||||||
Opaque<ImplWithAbstractMembers, TraitApplierSuperTag>
|
Opaque<ImplWithAbstract, TraitApplierSuperTag>
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
export function trait<
|
export function trait<
|
||||||
AbstractMembers extends object = {}
|
Abstract extends object = {}
|
||||||
>(): (
|
>(): (
|
||||||
<ImplWithAbstractMembers extends Class<AbstractMembers, []>>(
|
<ImplWithAbstract extends Class<Abstract, []>>(
|
||||||
apply: TraitApplier<AbstractMembers, ImplWithAbstractMembers>
|
apply: TraitApplier<Abstract, ImplWithAbstract>
|
||||||
) => Trait<
|
) => Trait<
|
||||||
AbstractMembers,
|
Abstract,
|
||||||
ImplWithAbstractMembers
|
RemoveAbstractFromImplClass<ImplWithAbstract, Abstract>
|
||||||
>
|
>
|
||||||
) {
|
) {
|
||||||
return apply => ({ apply }) as any
|
return apply => ({ apply }) as any
|
||||||
|
|||||||
Reference in New Issue
Block a user