63 lines
1.3 KiB
TypeScript
63 lines
1.3 KiB
TypeScript
import { expresses, trait } from "."
|
|
|
|
|
|
const Identifiable = <ID>() =>
|
|
trait(Parent => {
|
|
abstract class Identifiable extends Parent {
|
|
abstract readonly id: ID
|
|
|
|
equals(el: Identifiable) {
|
|
return this.id === el.id
|
|
}
|
|
|
|
constructor(...args: any[]) {
|
|
super(...args)
|
|
console.log("Identified constructor")
|
|
}
|
|
}
|
|
|
|
return Identifiable
|
|
})
|
|
|
|
const ImplementsIdentifiable = <ID>(defaultID: ID) =>
|
|
trait(Parent => {
|
|
abstract class ImplementsIdentifiable extends Identifiable<ID>()(Parent) {
|
|
id: ID = defaultID
|
|
}
|
|
|
|
return ImplementsIdentifiable
|
|
})
|
|
|
|
|
|
const Permissible = trait(Parent => {
|
|
abstract class Permissible extends Parent {
|
|
static readonly defaultPermissions: string[] = []
|
|
permissions: string[] = []
|
|
|
|
constructor(...args: any[]) {
|
|
super(...args)
|
|
console.log("Permissible constructor")
|
|
}
|
|
}
|
|
|
|
return Permissible
|
|
})
|
|
|
|
|
|
const UserProto = expresses(
|
|
// Identifiable<bigint>(),
|
|
ImplementsIdentifiable(0n),
|
|
Permissible,
|
|
)
|
|
|
|
class User extends UserProto {
|
|
constructor(id: bigint) {
|
|
super()
|
|
this.id = id
|
|
}
|
|
}
|
|
|
|
const user1 = new User(1n)
|
|
console.log(user1)
|
|
console.log(user1.equals(user1))
|