Subtraiting tests
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
Julien Valverdé
2023-12-28 18:58:01 +01:00
parent b7f31e62a4
commit 300b52e31c
2 changed files with 31 additions and 9 deletions

View File

@@ -1,7 +1,7 @@
import { extendsAndExpresses, trait } from "./trait-inheritance" import { expresses, trait } from "./trait-inheritance"
const Identified = <ID>() => const Identifiable = <ID>() =>
trait(Parent => { trait(Parent => {
abstract class Identified extends Parent { abstract class Identified extends Parent {
abstract id: ID abstract id: ID
@@ -9,11 +9,25 @@ const Identified = <ID>() =>
equals(el: Identified) { equals(el: Identified) {
return this.id === el.id return this.id === el.id
} }
constructor(...args: any[]) {
super(...args)
console.log("Identified constructor")
}
} }
return Identified return Identified
}) })
const ImplementsIdentifiable = <ID>(defaultID: ID) =>
trait(Parent => {
abstract class ImplementsIdentifiable extends Identifiable<ID>()(Parent) {
id: ID = defaultID
}
return ImplementsIdentifiable
})
const Permissible = trait(Parent => { const Permissible = trait(Parent => {
abstract class Permissible extends Parent { abstract class Permissible extends Parent {
@@ -30,14 +44,16 @@ const Permissible = trait(Parent => {
}) })
const UserProto = extendsAndExpresses(class {}, [ const UserProto = expresses(
Identified<bigint>(), // Identifiable<bigint>(),
ImplementsIdentifiable(0n),
Permissible, Permissible,
] as const) )
class User extends UserProto { class User extends UserProto {
constructor(readonly id: bigint) { constructor(id: bigint) {
super() super()
this.id = id
} }
} }

View File

@@ -38,13 +38,12 @@ export function trait<
export function extendsAndExpresses< export function extendsAndExpresses<
C extends AbstractClass<any, any>, C extends AbstractClass<any>,
Traits extends readonly Trait<any>[], Traits extends readonly Trait<any>[],
>( >(
extend: C, extend: C,
traits: Traits, traits: Traits,
) { ) {
return traits.reduce( return traits.reduce(
(previous, trait) => trait(previous), (previous, trait) => trait(previous),
extend, extend,
@@ -71,5 +70,12 @@ export function extendsAndExpresses<
> >
> >
) )
}
export function expresses<
Traits extends readonly Trait<any>[],
>(
...traits: Traits
) {
return extendsAndExpresses(Object, traits)
} }