为什么VS Code不为我的JavaScript函数的返回类型提供自动完成功能?

j8ag8udp  于 2023-03-28  发布在  Java
关注(0)|答案(1)|浏览(118)

我正在使用Visual Studio Code和JavaScript进行Web开发项目。在我的代码中,我有一个函数,它创建一个新的div元素并将其分配给一个名为newDiv的变量。下面是代码:

function createNode(tag,id) {
    let newNode = document.createElement(tag)
    newNode.id = id;
    return newNode;
}

let newDiv = createNode("div", "identificador1");

但是,当我在代码编辑器中键入“newDiv.”时,VS Code并没有为newDiv提供任何方法或属性,即使它是一个div元素。
我希望看到一个可用方法的列表,例如classListgetAttributeappendChild,但是什么也没有出现。
我尝试了以下解决方案:

  • 重新启动VS代码
  • 检查我是否正确键入了句点(“.”)
  • 检查是否有错别字。
  • newDiv的类型显式指定为HTMLDivElement可以工作,VS Code开始提供方法,但单词“as”导致Uncaught SyntaxError。如下所示:
let newDiv = createNode("div", "identificador1") as HTMLDivElement;

这些解决方案对我都不起作用。有人能帮助我理解为什么VS Code没有提供newDiv的方法,以及我如何解决这个问题吗?

zbsbpyhn

zbsbpyhn1#

你还没有做任何事情来告诉静态分析你的函数的预期输入类型。在VS Code中,你可以用JS Doc annotations为JavaScript做这件事:

/**
 * @param tag {keyof HTMLElementTagNameMap}
 * @param id {string}
 */
function createNode(tag,id) {
    let newNode = document.createElement(tag)
    newNode.id = id;
    return newNode;
}

由TypeScript支持的VS Code的静态分析现在将能够基于输入类型注解和函数体推断返回类型。(它将建议HTMLElementTagNameMap中所有类型值的intersection type,因为没有泛型它不能做得更好)。如果你想要确切的HTMLDivElement类型,你必须使用/**@type {HTMLDivElement}*/ let newDiv = createNode(...);提示它。
如果你能在JS Doc中使用更好的泛型(TypeScript有),你就能得到更好的返回类型推断。目前VS Code似乎还不太支持类型注解中的TypeScript泛型。我尝试了以下方法,只是作为一个假设,这样的语法似乎不受支持:

/**
 * @template T {keyof HTMLElementTagNameMap}
 * @param tag {T}
 * @param id {string}
 * @returns {HTMLElementTagNameMap[T]}
 */
function createNode(tag,id) {
    let newNode = document.createElement(tag)
    newNode.id = id;
    return newNode;
}

(See另请参见:Document generic type parameters in JSDOC
您尝试使用as(类型Assert)关键字不起作用,因为这不是JavaScript语法。这是TypeScript语法。您可以使用@type {...}在JS Doc中使用JavaScript中的类型注解。

相关问题