I have the following files:
abstractfoo.ts:
export abstract class AbstractFoo {
public constructor() {
throw new Error("I am not instantiable");
}
public static foo(param: string) {
const str = this.plzOverrideMe();
console.log(str);
console.log(param);
}
protected static plzOverrideMe(): string {
throw new Error("An override of this function is required");
}
};
concretefoo.ts:
import { AbstractFoo } from "./abstractfoo"
class ConcreteFoo extends AbstractFoo {
public static override foo(param: string) {
super.foo(param);
}
protected static override plzOverrideMe() {
return "blah";
}
};
export default ConcreteFoo.foo;
voodoo.ts:
import voodoo from "./concretefoo"
voodoo("whatisthis")
tsc happily compiles these files with no errors. However, it crashes at runtime:
var str = this.plzOverrideMe();
^
TypeError: Cannot read properties of undefined (reading 'plzOverrideMe')
I'm not sure what I'm even looking for. Why is it undefined, and what can I do to get it to return the string i want?
CodePudding user response:
As far as TS is concerned, ConcreteFoo.foo is type (param: string) => void. There is no this parameter, so TypeScript doesn't check that.
If you give your method a this parameter, then it'll error as expected::
public static override foo(this: typeof ConcreteFoo, param: string) {
To make it work at runtime, you'll need to use bind:
export default ConcreteFoo.foo.bind(ConcreteFoo);
which you can read more about at MDN.
