You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

在VS Code中如何在HTML的<script>标签引用.d.ts类型定义文件?

在VS Code的HTML <script>标签中引用TypeScript .d.ts类型定义

当然可行!我来帮你梳理问题所在和具体解决步骤,让你在HTML脚本里也能顺畅用上类型提示:

首先,修正你的tsconfig.json配置

之前你觉得tsconfig没用其实是误解了——VS Code的类型检查依赖它来识别项目结构和类型文件。请更新配置,确保它覆盖HTML文件和类型定义:

{
  "compilerOptions": {
    "baseUrl": ".",
    "paths": {
      "myLib": ["./types/MyLib/index.d.ts"],
      "myLib2": ["./types/MyLib/index2.d.ts"]
    },
    "allowJs": true,          // 允许检查JS文件/脚本
    "checkJs": true,          // 开启JS的类型检查
    "strict": false           // 可根据你的需求调整严格模式
  },
  "include": [
    "*.html",                // 把HTML文件纳入检查范围
    "types/**/*.d.ts"        // 包含所有类型定义文件
  ]
}

针对全局命名空间类型的引用方式(对应你的尝试1)

如果你的.d.ts是全局命名空间声明(比如declare namespace myLib),可以直接在HTML的<script>里这样用:

类型定义文件(types/MyLib/index.d.ts):

declare namespace myLib {
  function makeGreeting(s: string): string;
  let numberOfGreetings: number;
}

HTML中的<script>标签:

<script>
// @ts-check 必须加上这行,启用VS Code的类型检查
/// <reference path="./types/MyLib/index.d.ts" />
// 注意:路径要相对于当前HTML文件的位置,比如HTML在子目录里就要调整为../types/...

const result = myLib.makeGreeting("Cheese");
console.log(result);
</script>

针对模块类型的引用方式(对应你的尝试2)

如果你的.d.ts用了模块导出,可以通过JSDoc的import类型来引用,同时要确保全局变量挂载在window上:

类型定义文件(types/MyLib/index2.d.ts):

export declare namespace myLib2 {
  export function makeGreeting(s: string): string;
}

// 声明全局变量挂载在window上
declare global {
  interface Window {
    myLib2: typeof myLib2;
  }
}

HTML中的<script>标签:

<script>
// @ts-check
/** @type {import('./types/MyLib/index2').myLib2} */
const myLib2 = window.myLib2;

const result = myLib2.makeGreeting("Orange");
console.log(result);
</script>

关键注意事项

  • 一定要加// @ts-check:没有这行,VS Code不会对这个script标签做类型检查,自然也不会识别.d.ts
  • 路径要准确:<reference path="..." />import()里的路径必须相对于当前HTML文件,写错路径是最常见的问题。
  • 重载类型检查服务:如果配置后没生效,打开VS Code的命令面板(Ctrl+Shift+P),执行TypeScript: Reload Project命令,让VS Code重新加载配置。

内容的提问来源于stack exchange,提问作者Jon49

火山引擎 最新活动