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

如何在File B中从外部文件导入class foo的JSDOC文档

JSDoc跨文件导入未直接导出类类型的实现方案

你可以通过两种无侵入的JSDoc原生语法实现需求,不需要改动原有业务代码的导出逻辑:

方案1:直接在FileB中提取导入类型(无需修改FileA)

这是侵入性最低的方案,不需要调整FileA的任何代码,利用JSDoc支持的动态类型导入语法,先拿到FileA默认导出对象的类型,再索引提取挂载在对象上的foo类类型即可。

注意你原有代码中@typdef存在拼写错误,正确关键字为@typedef

修正后的FileB.js代码:

// FileB.js
/** @typedef {import('./FileA.js').default.foo} foo */

/**
 * @param {foo} foo - This is a foo
 */
function bar(foo) { return true }

语法说明:

  • import('./FileA.js') 用于获取FileA整个模块的类型结构,路径规则和普通JS值导入完全一致,使用相对路径即可
  • .default 对应FileA的默认导出值objectThatContainsFoo
  • 末尾的.foo 对应导出对象上挂载的foo类,如果你给类起了别的属性名,替换成对应属性名即可

方案2:在FileA中单独导出类型(适合多文件复用场景)

如果多个文件都需要引用foo的类型,或者foo类完全没有挂载到导出对象上,可以在FileA中单独导出foo的类型别名,不需要修改原有值导出的逻辑。
首先修改FileA.js:

// FileA.js
/** This is a class */
class foo { }

// 单独导出foo的类型,不会对外暴露foo类本身的值
/** @typedef {foo} Foo */

export default objectThatContainsFoo // foo依然不直接导出

之后在FileB.js中直接导入该类型即可:

// FileB.js
/** @typedef {import('./FileA.js').Foo} foo */

/**
 * @param {foo} foo - This is a foo
 */
function bar(foo) { return true }

补充说明

  • 上述写法兼容所有支持JSDoc类型检查的工具,包括VS Code内置类型提示、TypeScript checkJs模式、Google Closure Compiler等
  • 如果导出对象上挂载的是foo类的实例而非类本身,可以用内置工具类型提取实例类型:/** @typedef {InstanceType<import('./FileA.js').default.foo>} foo */
  • 类型导入属于静态分析范畴,不会产生实际的JS运行时代码,不会增加打包体积

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 02:36:10