【发布时间】:2021-08-31 03:49:23
【问题描述】:
我正在将一个项目转换为 Typsescript。这是一段艰难的旅程,但我正在一步一步地到达那里。不过,有一件事一直让我难以捉摸。
我可以在 纯 Javascript 中做到这一点:
class Example {
callThis(methodName) {
if (typeof this[methodName] === "function"){
this[methodName]();
}
}
getSomeText() {
return this.someText;
}
setSomeText(someText) {
this.someText = someText;
}
myMethod() {
console.log(this.getSomeText());
}
myOtherMethod() {
//etc
}
//and more methods that can be called with callThis()
}
const aTest = new Example;
aTest.setSomeText("calling myMethod()");
aTest.callThis("myMethod");
这运行良好并输出“调用 myMethod()”。当我将其转换为 Typescript 时,callThis 方法出现错误。它告诉我:
元素隐含地具有“任何”类型,因为“字符串”类型的表达式不能用于索引类型“示例”。 在“示例”类型上找不到具有“字符串”类型参数的索引签名。
我怎样才能让 TypeScript 接受这个设置?稍后我将添加新的可调用方法,不仅仅是这个,所以我希望尽可能灵活。我已经创造了一些新的类型,但我在这个阶段还是个婴儿,所以请耐心等待。
这背后的整个想法是,该类用于从 HTML <template> 节点创建对话框,callThis 函数用于在节点添加到 DOM 后向其添加事件侦听器。
【问题讨论】:
-
您为什么要这样做?为什么不一开始就调用你想要的方法呢?
-
这让我觉得是 X-Y 问题和/或架构问题。像这样完全任意的设置几乎必须 被
any所覆盖,这违背了目的。我的第一种方法是为 name => impl 结构中的函数提供上下文,允许简单地键入上下文和函数。 -
@RobertoZvjerković 你说得对,我一直是隧道视觉的受害者。我想让一个函数完成所有渲染,然后调用该函数,但这是不必要的并且会污染渲染位。谢谢!附言。 Noobish here:我应该删除这个问题吗?
标签: javascript typescript