Changed Classes to Constructors
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
Julien Valverdé
2024-05-12 03:35:02 +02:00
parent 4d19faa494
commit 1685309a45
6 changed files with 38 additions and 41 deletions

View File

@@ -1,4 +1,4 @@
import { AbstractClass, Class, Simplify } from "type-fest" import { AbstractConstructor, Constructor, Simplify } from "type-fest"
import { TraitExpression } from "./TraitExpression" import { TraitExpression } from "./TraitExpression"
import { Extend, StaticMembers } from "./util" import { Extend, StaticMembers } from "./util"
@@ -10,13 +10,13 @@ export class Trait<
>, >,
Abstract extends object, Abstract extends object,
StaticAbstract extends object, StaticAbstract extends object,
ImplClass extends AbstractClass<object, []>, ImplClass extends AbstractConstructor<object, []>,
> { > {
constructor( constructor(
readonly superExpression: SuperExpression, readonly superExpression: SuperExpression,
readonly abstract: Abstract, readonly abstract: Abstract,
readonly staticAbstract: StaticAbstract, readonly staticAbstract: StaticAbstract,
readonly apply: (Super: AbstractClass<object>) => ImplClass, readonly apply: (Super: AbstractConstructor<object>) => ImplClass,
) {} ) {}
} }
@@ -118,12 +118,12 @@ export namespace TraitTuple {
export type TraitClass<T extends Trait<any, any, any, any>> = ( export type TraitClass<T extends Trait<any, any, any, any>> = (
AbstractClass<TraitInstance<T>, any[]> & AbstractConstructor<TraitInstance<T>, any[]> &
TraitStaticMembers<T> TraitStaticMembers<T>
) )
export type TraitConcreteClass<T extends Trait<any, any, any, any>> = ( export type TraitConcreteClass<T extends Trait<any, any, any, any>> = (
Class<TraitInstance<T>, any[]> & Constructor<TraitInstance<T>, any[]> &
TraitStaticMembers<T> TraitStaticMembers<T>
) )

View File

@@ -1,4 +1,4 @@
import { AbstractClass, Class, Simplify } from "type-fest" import { AbstractConstructor, Constructor, Simplify } from "type-fest"
import { Trait } from "./Trait" import { Trait } from "./Trait"
import { TraitExpression } from "./TraitExpression" import { TraitExpression } from "./TraitExpression"
import { Extend, StaticMembers } from "./util" import { Extend, StaticMembers } from "./util"
@@ -14,22 +14,20 @@ export class TraitBuilder<
>, >,
Abstract extends object, Abstract extends object,
StaticAbstract extends object, StaticAbstract extends object,
ImplClass extends AbstractClass<object, []>, ImplClass extends AbstractConstructor<object, []>,
> { > {
declare ["constructor"]: typeof TraitBuilder
constructor( constructor(
readonly traitSuperExpression: SuperExpression, readonly traitSuperExpression: SuperExpression,
readonly traitAbstract: Abstract, readonly traitAbstract: Abstract,
readonly traitStaticAbstract: StaticAbstract, readonly traitStaticAbstract: StaticAbstract,
readonly traitApply: (Super: AbstractClass<object>) => ImplClass, readonly traitApply: (Super: AbstractConstructor<object>) => ImplClass,
) {} ) {}
abstract<A extends Abstract>( abstract<A extends Abstract>(
_: (Super: AbstractClass<Abstract>) => AbstractClass<A, []> _: (Super: AbstractConstructor<Abstract>) => AbstractConstructor<A, []>
) { ) {
return new this.constructor( return new TraitBuilder(
this.traitSuperExpression, this.traitSuperExpression,
{} as Simplify<A>, {} as Simplify<A>,
this.traitStaticAbstract, this.traitStaticAbstract,
@@ -38,9 +36,9 @@ export class TraitBuilder<
} }
staticAbstract<A extends StaticAbstract>( staticAbstract<A extends StaticAbstract>(
_: (Super: AbstractClass<StaticAbstract>) => AbstractClass<A, []> _: (Super: AbstractConstructor<StaticAbstract>) => AbstractConstructor<A, []>
) { ) {
return new this.constructor( return new TraitBuilder(
this.traitSuperExpression, this.traitSuperExpression,
this.traitAbstract, this.traitAbstract,
{} as Simplify<A>, {} as Simplify<A>,
@@ -53,13 +51,13 @@ export class TraitBuilder<
>( >(
apply: (Super: TraitBuilder.ImplSuper<typeof this>) => ImplClassWithAbstract apply: (Super: TraitBuilder.ImplSuper<typeof this>) => ImplClassWithAbstract
) { ) {
return new this.constructor( return new TraitBuilder(
this.traitSuperExpression, this.traitSuperExpression,
this.traitAbstract, this.traitAbstract,
this.traitStaticAbstract, this.traitStaticAbstract,
apply as unknown as (Super: AbstractClass<object>) => ( apply as unknown as (Super: AbstractConstructor<object>) => (
AbstractClass< AbstractConstructor<
Simplify< Simplify<
Omit< Omit<
InstanceType<ImplClassWithAbstract>, InstanceType<ImplClassWithAbstract>,
@@ -98,7 +96,7 @@ export namespace TraitBuilder {
infer ImplClass infer ImplClass
> >
? ( ? (
AbstractClass< AbstractConstructor<
Simplify< Simplify<
Extend<[ Extend<[
Abstract, Abstract,
@@ -121,7 +119,7 @@ export namespace TraitBuilder {
export type ImplStatic< export type ImplStatic<
ImplClass extends AbstractClass<object> & { readonly [implSuperSymbol]: true } ImplClass extends AbstractConstructor<object> & { readonly [implSuperSymbol]: true }
> = ( > = (
Simplify< Simplify<
Omit<StaticMembers<ImplClass>, typeof implSuperSymbol> Omit<StaticMembers<ImplClass>, typeof implSuperSymbol>
@@ -129,14 +127,14 @@ export type ImplStatic<
) )
export function implStaticThis< export function implStaticThis<
ImplClass extends AbstractClass<object> & { readonly [implSuperSymbol]: true }, ImplClass extends AbstractConstructor<object> & { readonly [implSuperSymbol]: true },
This extends AbstractClass<object>, This extends AbstractConstructor<object>,
>( >(
_Impl: ImplClass, _Impl: ImplClass,
thisArg: This, thisArg: This,
) { ) {
return thisArg as unknown as ( return thisArg as unknown as (
AbstractClass< AbstractConstructor<
InstanceType<ImplClass> & InstanceType<This>, InstanceType<ImplClass> & InstanceType<This>,
ConstructorParameters<This> ConstructorParameters<This>
> & > &
@@ -146,14 +144,14 @@ export function implStaticThis<
} }
export function implStaticInstantiableThis< export function implStaticInstantiableThis<
ImplClass extends AbstractClass<object> & { readonly [implSuperSymbol]: true }, ImplClass extends AbstractConstructor<object> & { readonly [implSuperSymbol]: true },
This extends Class<object>, This extends Constructor<object>,
>( >(
_Impl: ImplClass, _Impl: ImplClass,
thisArg: This, thisArg: This,
) { ) {
return thisArg as unknown as ( return thisArg as unknown as (
Class< Constructor<
InstanceType<ImplClass> & InstanceType<This>, InstanceType<ImplClass> & InstanceType<This>,
ConstructorParameters<This> ConstructorParameters<This>
> & > &
@@ -167,5 +165,5 @@ export const trait = new TraitBuilder(
new TraitExpression(TraitExpression.NullSuperclass, []), new TraitExpression(TraitExpression.NullSuperclass, []),
{} as object, {} as object,
{} as object, {} as object,
Super => class extends Super {} as AbstractClass<object>, Super => class extends Super {} as AbstractConstructor<object>,
) )

View File

@@ -1,11 +1,11 @@
import { AbstractClass, Class, Simplify } from "type-fest" import { AbstractConstructor, Constructor, Simplify } from "type-fest"
import { Trait, TraitTuple } from "./Trait" import { Trait, TraitTuple } from "./Trait"
import { TraitBuilder } from "./TraitBuilder" import { TraitBuilder } from "./TraitBuilder"
import { Extend, StaticMembers } from "./util" import { Extend, StaticMembers } from "./util"
export type TraitExpressionLike< export type TraitExpressionLike<
Superclass extends AbstractClass<object>, Superclass extends AbstractConstructor<object>,
Traits extends readonly Trait<any, any, any, any>[], Traits extends readonly Trait<any, any, any, any>[],
> = { > = {
readonly superclass: Superclass, readonly superclass: Superclass,
@@ -14,7 +14,7 @@ export type TraitExpressionLike<
export class TraitExpression< export class TraitExpression<
Superclass extends AbstractClass<object>, Superclass extends AbstractConstructor<object>,
const Traits extends readonly Trait<any, any, any, any>[], const Traits extends readonly Trait<any, any, any, any>[],
> >
implements TraitExpressionLike<Superclass, Traits> { implements TraitExpressionLike<Superclass, Traits> {
@@ -25,7 +25,7 @@ implements TraitExpressionLike<Superclass, Traits> {
get extends(): ( get extends(): (
AbstractClass< AbstractConstructor<
InstanceType<Superclass> & // Keep the instance of the superclass outside of any kind of type manipulation InstanceType<Superclass> & // Keep the instance of the superclass outside of any kind of type manipulation
// as it can accidentely remove abstract properties // as it can accidentely remove abstract properties
Simplify< Simplify<
@@ -69,7 +69,7 @@ implements TraitExpressionLike<Superclass, Traits> {
Extend<TraitTuple.MapStaticAbstract<Traits>> Extend<TraitTuple.MapStaticAbstract<Traits>>
>, >,
AbstractClass< AbstractConstructor<
Simplify< Simplify<
Extend<TraitTuple.MapImplInstance<Traits>> Extend<TraitTuple.MapImplInstance<Traits>>
> >
@@ -135,7 +135,7 @@ export type StaticImplements<
export type TraitExpressionClass< export type TraitExpressionClass<
Exp extends TraitExpressionLike<any, readonly Trait<any, any, any, any>[]> Exp extends TraitExpressionLike<any, readonly Trait<any, any, any, any>[]>
> = ( > = (
AbstractClass< AbstractConstructor<
TraitExpressionInstance<Exp>, TraitExpressionInstance<Exp>,
ConstructorParameters<TraitExpression.Superclass<Exp>> ConstructorParameters<TraitExpression.Superclass<Exp>>
> & > &
@@ -145,7 +145,7 @@ export type TraitExpressionClass<
export type TraitExpressionConcreteClass< export type TraitExpressionConcreteClass<
Exp extends TraitExpressionLike<any, readonly Trait<any, any, any, any>[]> Exp extends TraitExpressionLike<any, readonly Trait<any, any, any, any>[]>
> = ( > = (
Class< Constructor<
TraitExpressionInstance<Exp>, TraitExpressionInstance<Exp>,
ConstructorParameters<TraitExpression.Superclass<Exp>> ConstructorParameters<TraitExpression.Superclass<Exp>>
> & > &

View File

@@ -1,4 +1,4 @@
import { AbstractClass } from "type-fest" import { AbstractConstructor } from "type-fest"
import { Trait, TraitTuple } from "./Trait" import { Trait, TraitTuple } from "./Trait"
import { TraitExpression } from "./TraitExpression" import { TraitExpression } from "./TraitExpression"
import { SpreadSupertraits, spreadSupertraits } from "./spreadSupertraits" import { SpreadSupertraits, spreadSupertraits } from "./spreadSupertraits"
@@ -7,7 +7,7 @@ import { Extendable, StaticMembers } from "./util"
export class TraitExpressionBuilder< export class TraitExpressionBuilder<
Superclass extends AbstractClass<object>, Superclass extends AbstractConstructor<object>,
const Traits extends readonly Trait<any, any, any, any>[], const Traits extends readonly Trait<any, any, any, any>[],
> { > {
constructor( constructor(
@@ -17,7 +17,7 @@ export class TraitExpressionBuilder<
extends< extends<
Super extends AbstractClass<object> Super extends AbstractConstructor<object>
>( >(
superclass: Super superclass: Super
) { ) {
@@ -125,7 +125,7 @@ export namespace TraitExpressionBuilder {
) )
export type BuildTraitExpression< export type BuildTraitExpression<
Superclass extends AbstractClass<object>, Superclass extends AbstractConstructor<object>,
Traits extends readonly Trait<any, any, any, any>[], Traits extends readonly Trait<any, any, any, any>[],
> = ( > = (
Extendable<TraitTuple.MapAbstract<Traits>> extends false Extendable<TraitTuple.MapAbstract<Traits>> extends false

View File

@@ -1,6 +1,5 @@
import { Schema as S } from "@effect/schema" import { Schema as S } from "@effect/schema"
import { Implements } from "../TraitExpression" import { Implements } from "../TraitExpression"
import { EffectSchemaTraitExpression } from "./EffectSchemaTraitExpression"
import { effectSchemaExpression } from "./EffectSchemaTraitExpressionBuilder" import { effectSchemaExpression } from "./EffectSchemaTraitExpressionBuilder"

View File

@@ -1,4 +1,4 @@
import { AbstractClass } from "type-fest" import { AbstractConstructor } from "type-fest"
/** /**
@@ -10,8 +10,8 @@ export type CommonKeys<A, B> = Extract<keyof A, keyof B>
/** /**
* Represents the static members of a class. * Represents the static members of a class.
* @template Class - A class extending AbstractClass. * @template Class - A class.
*/ */
export type StaticMembers<Class extends AbstractClass<any>> = ( export type StaticMembers<Class extends AbstractConstructor<any>> = (
Omit<Class, "prototype"> Omit<Class, "prototype">
) )