如何在打字稿中动态调用实例方法?

时间:2019-07-04 21:39:37

标签: typescript methods dynamic-programming dispatch

我有一个对象,并且想在其上动态调用一个方法。

进行类型检查会很好,但这可能是不可能的。 但是我什至无法完全编译它:

  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来解决该问题?

2 个答案:

答案 0 :(得分:1)

如果无法检查所使用的字符串是否是该类的有效成员,则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

答案 1 :(得分:0)

例如一些语法代码

  class Auth extends React.Component {
    validateField(fieldName: string) {
      const validator = this[`${fieldName}IsValid` as keyof Auth]
      ...
    }

    emailIsValid() {
      return /.+@.+/.test(this.state.email)
    }

    passwordIsValid() {
      return /.{3,}/.test(this.state.password || '')
    }

    render() {
      return (
        <form>
          <input name="email" onChange={this.validateFormField('email')} .../>
          <input name="password" onChange={this.validateFormField('password')} .../>
        </form>
      )
    }
  }