how to dynamically call instance methods in typescript?
Typescript will error if it can't check that the string used is a valid member of the class. This for example will work:
class MyClass {
methodA() {
console.log("A")
}
methodB() {
console.log("B")
}
runOne() {
const random = Math.random() > 0.5 ? "methodA" : "methodB" // random is typed as "methodA" | "methodB"
this[random](); //ok, since random is always a key of this
}
}
In the samples above removing the explicit type annotation from a constant should give you the literal type and allow you to use the const to index into this
.
You could also type the string as keyof Class
:
class MyClass {
methodA() {
console.log("A")
}
methodB() {
console.log("B")
}
runOne(member: Exclude<keyof MyClass, "runOne">) { // exclude this method
this[member](); //ok
}
}
If you already have a string
using an assertion to keyof MyClass
is also an option although this is not as type safe (this[member as keyof MyClass]
where let member: string
)