es6 类函数中的 this[functionName] 导致“元素隐式具有 'any' 类型,因为字符串类型的表达式不能用于索引”
Posted
技术标签:
【中文标题】es6 类函数中的 this[functionName] 导致“元素隐式具有 \'any\' 类型,因为字符串类型的表达式不能用于索引”【英文标题】:this[functionName] in an es6 class function cause "Element implicitly has an 'any' type because expression of type string can't be used to index"es6 类函数中的 this[functionName] 导致“元素隐式具有 'any' 类型,因为字符串类型的表达式不能用于索引” 【发布时间】:2021-12-08 10:32:09 【问题描述】:我正在尝试使用这样的 es6 类创建类似服务的命令:
class Person
run()
console.log("running");
walk()
console.log("walking");
talk()
console.log("talking");
execute(name: string)
this[name]()
const me = new Person();
me.execute('run');
me.execute('walk');
me.execute('talk');
这是完全有效的,但打字稿在 this[name]
部分狂吠:
TS7053: Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'Person'.
在这种情况下如何将“name”参数定义为Person的类成员类型?
【问题讨论】:
如果name
是任意字符串,那么它在特定上下文中起作用的保证是什么?
无效,Typescript 正确地告诉您 string
类型的参数不能用于索引您的对象,因为它没有索引签名。如果您希望参数仅为'run' | 'walk' | 'talk'
,那么您必须声明该类型 - 而不是string
。作为一般建议,如果您认为错误是编译器的错,那么您作为程序员就不会走得太远。
查看 Guerric 的 P 答案
【参考方案1】:
鉴于键可以是除execute
本身之外的任何类键,您可以按如下方式定义参数类型:
execute(name: Exclude<keyof Person, 'execute'>)
this[name]();
您可以在 TypeScript playground 上看到它的实际效果。
【讨论】:
谢谢,这正是我所需要的。干杯!【参考方案2】:定义名称类型如下
execute(name: "talk" | "walk" | "run")
this[name]()
【讨论】:
以上是关于es6 类函数中的 this[functionName] 导致“元素隐式具有 'any' 类型,因为字符串类型的表达式不能用于索引”的主要内容,如果未能解决你的问题,请参考以下文章