import { Implements, TraitAbstractMembers, expression, trait } from "." const PrintsHelloOnNew = trait()(Super => class PrintsHelloOnNew extends Super { constructor(...args: any[]) { super(...args) console.log("Hello!") } } ) const Identifiable = () => ( trait<{ readonly id: ID }>()(Super => class Identifiable extends Super { equals(el: Identifiable) { return this.id === el.id } } ) ) const StatefulSubscription = trait<{ readonly status: ( { _tag: "awaitingPayment" } | { _tag: "active", activeSince: Date, expiresAt?: Date } | { _tag: "expired", expiredSince: Date } ) }>()(Super => class StatefulSubscription extends Super {} ) interface ActiveStatefulSubscriptionAbstractMembers extends TraitAbstractMembers { readonly status: { _tag: "active", activeSince: Date, expiresAt?: Date } } const ActiveStatefulSubscription = trait()(Super => class ActiveStatefulSubscription extends Super {} ) class TestSuperclass { // id: number = 69 // static test = 69 } const builder = expression .extends(TestSuperclass) .expresses( PrintsHelloOnNew, Identifiable(), // Identifiable(), ) const exp = builder.get() type Abs = Implements class User extends exp.extends implements Implements { id: bigint = -1n } console.log(new User())