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' 类型,因为字符串类型的表达式不能用于索引”的主要内容,如果未能解决你的问题,请参考以下文章

类属性中的 es6 箭头函数

深入ES6中的class类

ES6中的class的使用

ES6 Class(类)

class 类 this指向的问题

es6-class