如何使用 JSDoc 将图表.js键入信息到我的普通 javascript 文件中?

How to get the Chart.js type information into my plain javascript file using JSDoc?

提问人:Jeroen 提问时间:11/12/2023 最后编辑:Jeroen 更新时间:11/19/2023 访问量:76

问:

赏金将在 2 天后到期。这个问题的答案有资格获得 +50 声望赏金。Jeroen希望引起人们对这个问题的更多关注
寻找适用于可重现场景的答案(在问题中,但也作为问题中链接的 GitHub 上的可克隆存储库)。具体来说,它应该适用于 Chart.js(或解释为什么这是不可能的)。

我似乎无法让 VSCode 中基于 JSDoc 的智能感知适用于 Chart.js 库。

可重现的场景

这些步骤最少,下面很详细,但您也可以克隆我使用此问题中的步骤创建的存储库。

我有一个相当旧的应用程序,这是我所拥有的最低限度的可重复变体:

  • npm i chart.js chartjs-adapter-moment moment
  • 创建一个如下所示的:index.html
<html>
  <script src="node_modules/moment/moment.js"></script>
  <script src="node_modules/chart.js/dist/chart.umd.js"></script>
  <script src="node_modules/chartjs-adapter-moment/dist/chartjs-adapter-moment.js"></script>
  <script src="app.js"></script>
  <div style="height: 200px; width: 300px;"><canvas id="my-chart"></canvas></div>
</html>
  • 创建一个如下文件:app.js
// @ts-check

/**
 * @typedef moment
 * @property {import('moment')} moment
 */

/**
 * @global {import('chart.js')} Chart
 */

document.addEventListener("DOMContentLoaded", () => {
  const ctx = document.getElementById("my-chart");
  const chartRef = new Chart(ctx, {
    type: "line",
    options: {
      scales: {
        x: { type: "time" },
        y: { min: 0, max: 10 },
      },
    },
    data: {
      datasets: [
        {
          label: 'Stuff',
          data: [
            { x: moment("2023-01-01"), y: 2 },
            { x: moment("2023-02-01"), y: 8 },
            { x: moment("2023-03-01"), y: 3 },
            { x: moment("2023-04-01"), y: 6 },
          ],
        },
      ],
    },
  });
});

问题

这些类型似乎在 VSCode 中运行良好。但是打字根本不起作用。以下是它目前在 VSCode 中的作用:momentChart

error tooltip over 'Chart'

我尝试了一堆不同的东西而不是声明,似乎没有任何效果。@global

底线/问题

当我不使用任何或类似类型时,如何在 VSCode 中正确获取 Chart.js 和相关类型的类型补全?Chartimportrequire


我尝试过的事情

出现了一个有用的答案,但我可以将其中的建议添加到“我尝试过的事情”中,但它们并没有解决我的具体问题,如下所述。

第一个建议是使用,但这给我留下了同样的错误:/** @typedef {import("chart.js")} */

找不到名称“Chart”。TS(2304)

Screenshot showing the error from above

正如我在某个时候对答案的评论中所写的那样,我想我也看到了:

“Chart”仅指一种类型,但在这里用作值。TS(2693)

但是我必须对建议略有不同,现在似乎再也无法得到那个特定的错误了。

对问题进行了编辑,建议尝试一下,这确实给了我:/** @typedef {import("chart.js").Chart} Chart */

“Chart”仅指一种类型,但在这里用作值。TS(2693)

从相应的屏幕截图中可以看出:

Screenshot of the error detailed above

JavaScript visual-studio-code 类型图表.js jsdoc

评论


答:

0赞 starball 11/13/2023 #1

尝试将 .@global/** @typedef {import("chart.js")} */

另请参阅 https://www.typescriptlang.org/docs/handbook/jsdoc-supported-types.html 以获取受支持的 JSDoc 事物的列表。我看不到那里。VS Code 的内置 JS 支持建立在 TypeScript 的 tsserver 之上。@global

如果需要特定类型,请导入类型:。/** @typedef {import("chart.js").Chart} Chart */

评论

0赞 Jeroen 11/14/2023
谢谢你的建议!不过,它给我留下了另一个问题需要解决,因为它将悬停在“图表”上的错误更改为消息“'图表'仅指一种类型,但在这里用作值。ts(2693)”。我想这是因为从库中导出的方式?Chart
0赞 Jeroen 11/15/2023
再次感谢您一直以来的帮助!然而,这仍然给我带来了麻烦,我已经用“我尝试过的事情”部分广泛更新了我的问题,详细说明了您的建议,并附上了失败结果的屏幕截图。- 你似乎对你的建议很有信心,所以也许我做错了什么?因此,我还添加了一个 GitHub 存储库,其中包含确切的可重现场景,该场景应该会给出我所遇到的所有这些确切错误。