Class Statics Per Eval
Each call of a function declaring a class makes a class with statics of its own: initializers and static members read that call's arguments.
function make(b: number) {
class D {
static base = b * 10;
static count = 0;
static inc() { D.count++; return D.count + D.base; }
bump() { D.count += 100; return D.count; }
}
class S extends D {
static extra = b + 0.5;
static both() { return S.extra + S.base; }
}
return [D, S] as const;
}
const [A, AS] = make(1);
const [B, BS] = make(2);
const K: any = A;
console.log(K.base, K.inc(), A.count, B.count);
console.log(new A().bump(), A.count, B.count, new B().bump());
console.log(AS.both(), BS.both(), AS.extra, BS.base);
console.log(Object.keys(A), Object.keys(B));
console.log(A, B.base);
class Top {
static n = 1;
static twice() { return this.n * 2; }
static { this.n += 4; }
}
console.log(Top.twice(), Top.n);
function counter(start: number) {
return class {
static v = start;
static next() { return ++this.v; }
};
}
const C1 = counter(10), C2 = counter(20);
console.log(C1.next(), C1.next(), C2.next(), C1.v, C2.v);View source on GitHubexamples/classes/class_statics_per_eval.ts