import { expresses, trait } from "." const Identifiable = () => 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 = (defaultID: ID) => trait(Parent => { abstract class ImplementsIdentifiable extends Identifiable()(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(), 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))