You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置TypeScript实现完全独立的模块编译?

解决独立脚本的TypeScript全局类型冲突问题

核心原因

尽管你的脚本在Obsidian Dataview中通过eval独立执行、无共享上下文,但TypeScript默认会将所有全局类型声明合并到同一个全局作用域中,导致不同脚本的myGlobalVariable类型冲突。

解决方案:为每个脚本创建隔离的类型作用域

1. 调整类型定义文件(.d.ts)

为每个脚本的全局类型声明包裹专属模块,避免全局合并:

script1.d.ts

declare module 'script1-context' {
  declare global {
    var myGlobalVariable: string; // script1中该变量的类型
  }
}

script2.d.ts

declare module 'script2-context' {
  declare global {
    var myGlobalVariable: number; // script2中该变量的类型,与script1冲突但不会被合并
  }
}

2. 在对应JS脚本中关联专属类型上下文

在每个JS文件顶部添加三斜线指令,明确引用自己的类型模块:

script1.js

/// <reference types="./script1-context" />

// 这里使用myGlobalVariable会得到string类型提示
console.log(myGlobalVariable.toUpperCase());

script2.js

/// <reference types="./script2-context" />

// 这里使用myGlobalVariable会得到number类型提示
console.log(myGlobalVariable.toFixed(2));

3. 优化tsconfig.json配置

确保配置符合isolatedModules要求,且只做类型检查(因为Dataview会直接执行JS):

{
  "compilerOptions": {
    "isolatedModules": true,
    "allowJs": true,
    "checkJs": true,
    "noEmit": true, // 不需要编译输出,仅做类型校验
    "module": "ESNext",
    "moduleResolution": "Node",
    "strict": true // 可选,开启严格类型检查
  },
  "include": ["*.js", "*.d.ts"]
}

替代方案:使用JSDoc直接在JS文件内声明类型

如果不想单独维护.d.ts文件,可以直接在JS文件中用JSDoc标记模块与全局变量类型:

script1.js

/**
 * @module script1
 */

/**
 * @global
 * @type {string}
 */
var myGlobalVariable;

// 类型提示生效
myGlobalVariable = "hello";

script2.js

/**
 * @module script2
 */

/**
 * @global
 * @type {number}
 */
var myGlobalVariable;

// 类型提示生效
myGlobalVariable = 123;

这种方式下,TypeScript会将每个标记为@module的JS文件视为独立模块,其内部的@global声明不会与其他模块的全局类型合并。

验证执行

运行tsc命令时,TypeScript会分别检查每个脚本的类型,不会再出现全局变量类型冲突的报错,同时保留了每个脚本的类型增强能力。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 18:52:35