Trait refactoring
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
Julien Valverdé
2024-02-03 01:09:40 +01:00
parent acc26c7e0c
commit a061bac1de
2 changed files with 37 additions and 40 deletions

View File

@@ -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

View File

@@ -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