我有一个对象,并且想在其上动态调用一个方法。
进行类型检查会很好,但这可能是不可能的。 但是我什至无法完全编译它:
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
来解决该问题?
答案 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>
)
}
}