0.1.0 #1
@@ -13,8 +13,8 @@ class TraitExpression<
|
|||||||
readonly traits: Traits,
|
readonly traits: Traits,
|
||||||
) {}
|
) {}
|
||||||
|
|
||||||
then<V>(fn: (e: this) => V): V {
|
get implements() {
|
||||||
return fn(this)
|
return {}
|
||||||
}
|
}
|
||||||
|
|
||||||
extends(): (
|
extends(): (
|
||||||
@@ -57,6 +57,44 @@ export type Implements<Exp extends TraitExpression<any, any>> = (
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class TraitExpressionBuilder<
|
||||||
|
Super extends AbstractClass<any>,
|
||||||
|
Traits extends readonly Trait<any, any>[],
|
||||||
|
> {
|
||||||
|
constructor(public expression: TraitExpression<Super, Traits>) {}
|
||||||
|
|
||||||
|
extends<
|
||||||
|
NewSuper extends AbstractClass<any>
|
||||||
|
>(superclass: NewSuper) {
|
||||||
|
return new TraitExpressionBuilder(
|
||||||
|
new TraitExpression(
|
||||||
|
superclass,
|
||||||
|
this.expression.traits,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
expresses<
|
||||||
|
AppendTraits extends readonly Trait<any, any>[]
|
||||||
|
>(...traits: AppendTraits) {
|
||||||
|
return new TraitExpressionBuilder(
|
||||||
|
new TraitExpression(
|
||||||
|
this.expression.superclass,
|
||||||
|
[...this.expression.traits, ...traits] as const,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
get() {
|
||||||
|
return this.expression as GetTraitExpression<Super, Traits>
|
||||||
|
}
|
||||||
|
|
||||||
|
then<V>(fn: (expression: typeof this.expression) => V): V {
|
||||||
|
return fn(this.expression)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
type AbstractMembersExtendable<
|
type AbstractMembersExtendable<
|
||||||
Super extends AbstractClass<any>,
|
Super extends AbstractClass<any>,
|
||||||
Traits extends readonly Trait<any, any>[],
|
Traits extends readonly Trait<any, any>[],
|
||||||
@@ -90,8 +128,7 @@ type ImplStaticMembersExtendable<
|
|||||||
]>
|
]>
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type GetTraitExpression<
|
||||||
type ExtendsAndExpressesReturnType<
|
|
||||||
Super extends AbstractClass<any>,
|
Super extends AbstractClass<any>,
|
||||||
Traits extends readonly Trait<any, any>[],
|
Traits extends readonly Trait<any, any>[],
|
||||||
> = (
|
> = (
|
||||||
@@ -106,22 +143,9 @@ type ExtendsAndExpressesReturnType<
|
|||||||
: TraitExpression<Super, Traits>
|
: TraitExpression<Super, Traits>
|
||||||
)
|
)
|
||||||
|
|
||||||
export function extendsAndExpresses<
|
|
||||||
Super extends AbstractClass<any>,
|
|
||||||
Traits extends readonly Trait<any, any>[],
|
|
||||||
>(
|
|
||||||
superclass: Super,
|
|
||||||
...traits: Traits
|
|
||||||
): ExtendsAndExpressesReturnType<Super, Traits> {
|
|
||||||
return new TraitExpression(superclass, traits) as any
|
|
||||||
}
|
|
||||||
|
|
||||||
class DefaultSuperclass {}
|
class DefaultSuperclass {}
|
||||||
|
|
||||||
export function expresses<
|
export const expression = new TraitExpressionBuilder(
|
||||||
Traits extends readonly Trait<any, any>[],
|
new TraitExpression(DefaultSuperclass, [] as const)
|
||||||
>(
|
)
|
||||||
...traits: Traits
|
|
||||||
): ExtendsAndExpressesReturnType<typeof DefaultSuperclass, Traits> {
|
|
||||||
return new TraitExpression(DefaultSuperclass, traits) as any
|
|
||||||
}
|
|
||||||
|
|||||||
28
src/tests.ts
28
src/tests.ts
@@ -1,4 +1,4 @@
|
|||||||
import { Implements, TraitAbstractMembers, extendsAndExpresses, trait } from "."
|
import { Implements, TraitAbstractMembers, expression, trait } from "."
|
||||||
|
|
||||||
|
|
||||||
const PrintsHelloOnNew = trait()(Super =>
|
const PrintsHelloOnNew = trait()(Super =>
|
||||||
@@ -44,21 +44,25 @@ const ActiveStatefulSubscription = trait<ActiveStatefulSubscriptionAbstractMembe
|
|||||||
|
|
||||||
class TestSuperclass {
|
class TestSuperclass {
|
||||||
// id: number = 69
|
// id: number = 69
|
||||||
static test = 69
|
// static test = 69
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const User = extendsAndExpresses(
|
const builder = expression
|
||||||
TestSuperclass,
|
.extends(TestSuperclass)
|
||||||
PrintsHelloOnNew,
|
.expresses(
|
||||||
|
// PrintsHelloOnNew,
|
||||||
Identifiable<bigint>(),
|
Identifiable<bigint>(),
|
||||||
// Identifiable<number>()
|
// Identifiable<number>(),
|
||||||
).then(e =>
|
|
||||||
class User
|
|
||||||
extends e.extends()
|
|
||||||
implements Implements<typeof e> {
|
|
||||||
id: bigint = -1n
|
|
||||||
}
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type Impl = Implements<typeof builder.expression>
|
||||||
|
|
||||||
|
|
||||||
|
const exp = builder.get()
|
||||||
|
|
||||||
|
class User extends exp.extends() implements (typeof exp.implements) {
|
||||||
|
// id: bigint = -1n
|
||||||
|
}
|
||||||
|
|
||||||
console.log(new User())
|
console.log(new User())
|
||||||
|
|||||||
Reference in New Issue
Block a user