为什么Visual Studio代码将我的函数识别为构造函数?

kokeuurv  于 2022-11-25  发布在  其他
关注(0)|答案(2)|浏览(247)

问题描述

我正在为我的一个项目检查我的代码时,我注意到我的一个函数的名称是绿色的,而所有其他函数都是黄色的。

当我将鼠标悬停在readButton.addEventListener("click", toggleRead);中的函数上时,它显示:Class toggleRead - function toggleRead(e: any): void
此外,当我将鼠标悬停在实际的函数声明上时,它显示为This constructor function may be converted to a class declaration.ts(80002)

附加信息

我正在使用toggleRead函数来切换属性。this关键字指的是调用该函数的按钮。它似乎没有在我的程序中引起任何问题,并且它正在按预期工作。

问题

我是否违反了某种导致此提示的代码约定,或者我是否做错了什么?另外,为什么visual studio认为此函数是构造函数?

类似问题

我发现this问题是关于堆栈溢出的,但问这个问题的人只对关闭提示感兴趣。我想知道我是否做错了什么。

代码

第一个

cqoc49vn

cqoc49vn1#

正如在注解中提到的,分析器可能会将其标记为构造函数,因为它是如何定义的+它内部的内容,这类似于构造函数的编写方式。
解决方案可以是使用const和lambda表达式来定义它,如下所示。

  • 更改第一行:*
function toggleRead(e) {
  • 更改为:*
const toggleRead = (e) => {

使用lambda表示法的另一个好处是,您可以使用此类函数,而无需首先对它们调用bind
因此,如果你现在正在执行this.toggleRead = this.toggleRead.bind(this);,那么你可以安全地删除它,因为lambda中的this在默认情况下总是创建lambda的对象。

z8dt9xmd

z8dt9xmd2#

我想把Raymond的建议贴在我的问题下面,因为这解决了我的问题:
解决办法是用更符合习惯的e.currentTarget代替this

// Toggle book read
function toggleRead(e) {
    const bookIndex = getBookIndex(e.currentTarget);
    const bookObject = library.at(bookIndex);
    if (bookObject.read) {
        bookObject.read = false;
        e.currentTarget.setAttribute("is-read", "false");
        e.currentTarget.innerHTML = "Unread";
    } else {
        bookObject.read = true;
        e.currentTarget.setAttribute("is-read", "true");
        e.currentTarget.innerHTML = "Read";
    }
}

相关问题