Как динамически вызывать методы экземпляра в машинописи? - PullRequest
1 голос
/ 05 июля 2019

У меня есть объект, и я хочу динамически вызывать метод для него.

Было бы неплохо иметь проверку типов, но, возможно, это невозможно. Но я даже сейчас не могу его скомпилировать:

  const key: string = 'someMethod'
  const func = this[key]
  func(msgIn)

дает мне эту ошибку ...

Element implicitly has an 'any' type 
because expression of type 'any' can't be used 
to index type 'TixBot'.

Я безуспешно пытался использовать другие варианты типов.

  const key: any = cmd.func
  const func: any = this[key]

Кроме @ts-ignore как я мог решить это? Мне было интересно, могу ли я использовать .call() или bind, чтобы как-то обойти это?

1 Ответ

1 голос
/ 05 июля 2019

Typescript выдаст ошибку, если не сможет проверить, является ли используемая строка допустимым членом класса. Это, например, будет работать:

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
    }
}

В приведенных выше примерах удаление явной аннотации типа из константы должно дать вам литеральный тип и позволить вам использовать const для индексации в this.

Вы также можете ввести строку как keyof Class:

class MyClass {
    methodA() {
        console.log("A")
    }
    methodB() {
        console.log("B")
    }

    runOne(member: Exclude<keyof MyClass, "runOne">) { // exclude this method
        this[member](); //ok
    }
}

Если у вас уже есть string с использованием утверждения для keyof MyClass, это также вариант, хотя это не является безопасным типом (this[member as keyof MyClass] где let member: string)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...