如何在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
相关产品推荐
相关产品推荐

