Fixed TraitBuilder
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
Julien Valverdé
2024-02-18 04:59:47 +01:00
parent 517792b1c2
commit 2acee3f2a3
3 changed files with 57 additions and 128 deletions

View File

@@ -65,6 +65,10 @@ export namespace Trait {
return: Trait.OwnImplInstance<this["arg0"]> return: Trait.OwnImplInstance<this["arg0"]>
} }
export type OwnImplStaticMembers<T> = (
StaticMembers<Trait.OwnImplClass<T>>
)
export type OwnClass<T> = ( export type OwnClass<T> = (
AbstractClass<Trait.OwnInstance<T>, any[]> & AbstractClass<Trait.OwnInstance<T>, any[]> &
Extend<[ Extend<[
@@ -91,6 +95,20 @@ export namespace Trait {
} }
} }
export namespace Traits {
export type MapImplClass<T extends readonly any[]> = {
[K in keyof T]: Trait.OwnImplClass<T[K]>
}
export type MapImplInstance<T extends readonly any[]> = {
[K in keyof T]: Trait.OwnImplInstance<T[K]>
}
export type MapImplStaticMembers<T extends readonly any[]> = {
[K in keyof T]: Trait.OwnImplStaticMembers<T[K]>
}
}
export type TraitClass<T extends Trait<any, any, any, any>> = ( export type TraitClass<T extends Trait<any, any, any, any>> = (
AbstractClass<TraitInstance<T>, any[]> & AbstractClass<TraitInstance<T>, any[]> &

View File

@@ -1,97 +1,25 @@
import { AbstractClass, Class, Simplify } from "type-fest" import { AbstractClass, Class, Simplify } from "type-fest"
import { Trait, TraitClass, TraitConcreteClass } from "./Trait" import { Trait, Traits } from "./Trait"
import { TraitExpression } from "./TraitExpression" import { TraitExpression } from "./TraitExpression"
import { ExtendPlain, StaticMembers } from "./util" import { ExtendPlain, StaticMembers } from "./util"
// type ExtendAbstractSuper<SuperExpression, Abstract> = (
// Simplify<
// ExtendPlain<[
// ...MapTraitsToOwnAbstract<
// TraitExpression.Traits<SuperExpression>
// >,
// Abstract,
// ]>
// >
// )
// type MapTraitsToOwnAbstract<T extends readonly any[]> = {
// [K in keyof T]: Trait.OwnAbstract<T[K]>
// }
// type ExtendStaticAbstractSuper<SuperExpression extends TraitExpression<any, any>, StaticAbstract extends object> = (
// Simplify<
// ExtendPlain<[
// ...MapTraitsToOwnStaticAbstract<
// TraitExpression.Traits<SuperExpression>
// >,
// StaticAbstract,
// ]>
// >
// )
// type MapTraitsToOwnStaticAbstract<T extends readonly any[]> = {
// [K in keyof T]: Trait.OwnStaticAbstract<T[K]>
// }
type ImplSuper< type ImplSuper<
SuperExpression extends TraitExpression< Supertraits extends Trait<any, any, any, any>[],
any,
Trait<any, any, any, any>[]
>,
Abstract extends object, Abstract extends object,
StaticAbstract extends object, StaticAbstract extends object,
> = ( > = (
AbstractClass< AbstractClass<
ExtendPlain<[ ExtendPlain<[
...MapTraitsToOwnImplInstance< ...Traits.MapImplInstance<Supertraits>,
TraitExpression.Traits<SuperExpression>
>,
Abstract, Abstract,
]> ]>
> & > &
// ExtendPlain<[ ExtendPlain<[
// ...MapTraitsToOwnImplStaticMembers< ...Traits.MapImplStaticMembers<Supertraits>,
// TraitExpression.Traits<SuperExpression> StaticAbstract,
// >, ]> &
// StaticAbstract, { readonly _tag: "@thilawyn/traitify-ts/Super" } // TODO: replace with unique symbol?
// ]>
ExtendPlain<
MapStaticMembers<
MapTraitsToOwnImplStaticMembers<
TraitExpression.Traits<SuperExpression>
>
>
>
)
type MapTraitsToOwnImplInstance<T extends readonly any[]> = {
[K in keyof T]: InstanceType<Trait.OwnImplClass<T[K]>>
}
type MapTraitsToOwnImplStaticMembers<T extends readonly any[]> = {
[K in keyof T]: Trait.OwnImplClass<T[K]>
}
type MapStaticMembers<T extends readonly AbstractClass<any>[]> = {
[K in keyof T]: StaticMembers<T[K]>
}
type TraitApplierSuperTag = "@thilawyn/traitify-ts/Super"
type RemoveAbstractFromImplClass<
ImplClassWithAbstract extends AbstractClass<object>,
Abstract extends object,
StaticAbstract extends object,
> = (
Class<
Omit<
InstanceType<ImplClassWithAbstract>,
keyof Abstract
>,
ConstructorParameters<ImplClassWithAbstract>
> &
Omit<
StaticMembers<ImplClassWithAbstract>,
keyof StaticAbstract | "_tag"
>
) )
@@ -134,32 +62,43 @@ export class TraitBuilder<
} }
implement< implement<
ImplClassWithAbstract extends ( ImplClassWithAbstract extends ImplSuper< // TODO: use This instead?
TraitConcreteClass< TraitExpression.Traits<SuperExpression>,
Trait<SuperExpression, Abstract, StaticAbstract, ImplClass> Abstract,
> & StaticAbstract
{ _tag: TraitApplierSuperTag } >
)
>( >(
apply: ( apply: (
Super: ( Super: ImplSuper<
TraitClass< TraitExpression.Traits<SuperExpression>,
Trait<SuperExpression, Abstract, StaticAbstract, ImplClass> Abstract,
> & StaticAbstract
{ _tag: TraitApplierSuperTag } >
)
) => ImplClassWithAbstract ) => ImplClassWithAbstract
) { ) {
return new TraitBuilder( return new TraitBuilder(
this.traitSuperExpression, this.traitSuperExpression,
this.traitAbstract, this.traitAbstract,
this.traitStaticAbstract, this.traitStaticAbstract,
// apply as unknown as (Super: AbstractClass<object>) => RemoveAbstractFromImplClass<
// ImplClassWithAbstract, apply as unknown as (Super: AbstractClass<object>) => (
// ExtendAbstractSuper<SuperExpression, Abstract>, Class<
// ExtendStaticAbstractSuper<SuperExpression, StaticAbstract> Simplify<
// >, Omit<
apply as unknown as (Super: AbstractClass<object>) => ImplClassWithAbstract, InstanceType<ImplClassWithAbstract>,
keyof Abstract
>
>,
ConstructorParameters<ImplClassWithAbstract>
> &
Simplify<
Omit<
StaticMembers<ImplClassWithAbstract>,
keyof StaticAbstract | "_tag"
>
>
),
) )
} }

View File

@@ -1,9 +1,7 @@
import { AbstractClass } from "type-fest" import { TraitClass } from "./Trait"
import { Trait, TraitClass } from "./Trait"
import { trait } from "./TraitBuilder" import { trait } from "./TraitBuilder"
import { Implements, ImplementsStatic, TraitExpression } from "./TraitExpression" import { Implements, ImplementsStatic } from "./TraitExpression"
import { expression } from "./TraitExpressionBuilder" import { expression } from "./TraitExpressionBuilder"
import { ExtendPlain, StaticMembers } from "./util"
const PrintsHelloOnNew = trait const PrintsHelloOnNew = trait
@@ -82,29 +80,3 @@ class User extends exp.extends implements Implements<typeof exp> {
} }
console.log(new User()) console.log(new User())
type ExpectObjectArray<T extends readonly object[]> = T
type MapOwnImplClass<T extends readonly any[]> = {
[K in keyof T]: Trait.OwnImplClass<T[K]>
}
type MapStaticMembers<T extends readonly any[]> = {
[K in keyof T]: StaticMembers<T[K]>
}
type MapClasses<Exp> = (
Exp extends TraitExpression<any, infer Traits>
? ExpectObjectArray<
MapStaticMembers<
MapOwnImplClass<
Traits
>
>
>
: never
)
type Output = MapClasses<typeof exp>