0.1.21 #21

Merged
Thilawyn merged 23 commits from next into master 2024-05-12 01:11:51 +02:00
3 changed files with 29 additions and 12 deletions
Showing only changes of commit d6be922c4d - Show all commits

View File

@@ -4,10 +4,20 @@ import { TraitBuilder } from "./TraitBuilder"
import { Extend, StaticMembers } from "./util"
export type TraitExpressionLike<
Superclass extends AbstractClass<object>,
Traits extends readonly Trait<any, any, any, any>[],
> = {
readonly superclass: Superclass,
readonly traits: Traits,
}
export class TraitExpression<
Superclass extends AbstractClass<object>,
const Traits extends readonly Trait<any, any, any, any>[],
> {
>
implements TraitExpressionLike<Superclass, Traits> {
constructor(
readonly superclass: Superclass,
readonly traits: Traits,
@@ -84,13 +94,13 @@ export namespace TraitExpression {
}
export type Superclass<T> = (
T extends TraitExpression<infer Superclass, any>
T extends TraitExpressionLike<infer Superclass, any>
? Superclass
: never
)
export type Traits<T> = (
T extends TraitExpression<any, infer Traits>
T extends TraitExpressionLike<any, infer Traits>
? Traits
: never
)
@@ -98,7 +108,7 @@ export namespace TraitExpression {
export type Implements<
Exp extends TraitExpression<any, readonly Trait<any, any, any, any>[]>
Exp extends TraitExpressionLike<any, readonly Trait<any, any, any, any>[]>
> = (
Simplify<
Extend<
@@ -110,7 +120,7 @@ export type Implements<
)
export type StaticImplements<
Exp extends TraitExpression<any, readonly Trait<any, any, any, any>[]>
Exp extends TraitExpressionLike<any, readonly Trait<any, any, any, any>[]>
> = (
Simplify<
Extend<
@@ -123,7 +133,7 @@ export type StaticImplements<
export type TraitExpressionClass<
Exp extends TraitExpression<any, readonly Trait<any, any, any, any>[]>
Exp extends TraitExpressionLike<any, readonly Trait<any, any, any, any>[]>
> = (
AbstractClass<
TraitExpressionInstance<Exp>,
@@ -133,7 +143,7 @@ export type TraitExpressionClass<
)
export type TraitExpressionConcreteClass<
Exp extends TraitExpression<any, readonly Trait<any, any, any, any>[]>
Exp extends TraitExpressionLike<any, readonly Trait<any, any, any, any>[]>
> = (
Class<
TraitExpressionInstance<Exp>,
@@ -143,7 +153,7 @@ export type TraitExpressionConcreteClass<
)
export type TraitExpressionInstance<
Exp extends TraitExpression<any, readonly Trait<any, any, any, any>[]>
Exp extends TraitExpressionLike<any, readonly Trait<any, any, any, any>[]>
> = (
InstanceType<TraitExpression.Superclass<Exp>> & // Keep the instance of the superclass outside of any kind of type manipulation
// as it can accidentely remove abstract properties
@@ -155,7 +165,7 @@ export type TraitExpressionInstance<
)
export type TraitExpressionStaticMembers<
Exp extends TraitExpression<any, readonly Trait<any, any, any, any>[]>
Exp extends TraitExpressionLike<any, readonly Trait<any, any, any, any>[]>
> = (
Simplify<
Extend<[

View File

@@ -1,7 +1,7 @@
import { Schema as S } from "@effect/schema"
import { Simplify } from "type-fest"
import { Trait, TraitTuple } from "../Trait"
import { StaticImplements, TraitExpression } from "../TraitExpression"
import { StaticImplements, TraitExpressionLike } from "../TraitExpression"
import { Extend } from "../util"
@@ -16,6 +16,10 @@ export class EffectSchemaTraitExpression<
Static extends object,
const Traits extends readonly Trait<any, any, any, any>[],
>
implements TraitExpressionLike<
S.Class<unknown, Fields, A, I, R, C, Inherited, Proto> & Static,
Traits
> {
constructor(
readonly superclass: S.Class<unknown, Fields, A, I, R, C, Inherited, Proto> & Static,
@@ -54,9 +58,9 @@ export class EffectSchemaTraitExpression<
}
staticImplements(_target: StaticImplements<TraitExpression<typeof this.superclass, Traits>>, _context: any) {}
staticImplements(_target: StaticImplements<typeof this>, _context: any) {}
get staticImplementsStage2() {
return (_target: StaticImplements<TraitExpression<typeof this.superclass, Traits>>) => {}
return (_target: StaticImplements<typeof this>) => {}
}
}

View File

@@ -12,6 +12,7 @@ const userExp = effectSchemaExpression
@userExp.staticImplements
class User extends userExp.extends<User>() implements Implements<typeof userExp> {
aMethodThatShouldBeInherited() {}
static aStaticMethodThatShouldBeInherited() {}
}
@@ -25,3 +26,5 @@ const adminExp = effectSchemaExpression
@adminExp.staticImplements
class Admin extends adminExp.extends<Admin>() implements Implements<typeof adminExp> {
}
new Admin({ id: 0n, role: "Admin" }).aMethodThatShouldBeInherited()