我可以在单独的文件中定义所有自定义类型(例如types.jsdoc
),以便可以在整个应用程序中重复使用它们吗?什么是正确的方法?
/**
* 2d coordinates.
* @typedef {Object} Coordinates
* @property {Number} x - Coordinate x.
* @property {Number} y - Coordinate y.
*/
答案 0 :(得分:5)
这是特定于TypeScript的JSDoc的答案,但是我成功使用triple-slash directive从另一个文件“导入”所有类型成功。这样做的好处是,实际上不会添加未使用的import
,这会破坏棉绒和捆扎机。
我将共享类型放在一个名为typedefs.js
的文件中,如下所示:
// typedefs.js
/**
* @typedef {Object} Foo
* @property {string} bar
*/
/**
* @typedef {Object} Baz
* @property {number} buzz
*/
,然后在其他文件中使用/// <reference path="typedefs.js" />
来访问共享类型,如下所示:
// randomThing.js
/// <reference path="typedefs.js" />
/**
* Turn a Foo into a Baz
*
* @param {Foo} a
* @return {Baz}
export function (a) {
return { buzz: a.bar.length };
}
但是,棘手的是,现在typedefs.js
仅在注释中被引用,像汇总这样的捆绑器完全错过了它。因此,我将其与我的旧consts.js
结合在一起,后者导出了一些常量,并且至少在一个地方导入了该常量。这样,typedef仍将包含在汇总输出中。
希望其他人对此有帮助。
p.s。汇总将完全排除纯JSDoc typedefs.js
文件_即使您由于摇晃而拥有import './typedefs.js'
也是如此!必须使用--no-treeshake
运行汇总,以将这些注释保留在汇总输出中。
答案 1 :(得分:1)
我通常在我的项目中做类似的事情,区别在于我使用扩展名.js
来命名文件。 Webstorm完美运行,能够检查类型并自动完成就好了。它无法识别.jsdoc
扩展名(我刚检查过),因此即使文件中不包含任何代码语句,也要坚持.js
。
答案 2 :(得分:1)
我刚尝试使用VSCode,只有在编辑器中打开单独的文件时它才有效。如果不是,则将外部typedef键入为任何
答案 3 :(得分:0)
在一个模块(例如typedefs.js
)中定义它们对我都有效:该模块包含所有jsdoc typdef,然后仅导出一个空的{}
对象。我可以在要使用类型定义的任何位置(例如const typedefs = require("./typedefs");
)将其导入。这是一个很小的额外步骤,但并不困难。
答案 4 :(得分:0)
在 vscode 中,import('./path/to/types.js').def
标签可以正常工作。
例如
types.js
/**
* @typedef {Object} connection
* @property {String} id
* @property {Number} pingRetries
* @property {(data:Object) => void} sendJSON
*/
exports.unused = {};
还有someFile.js
/**
* @param {import('./types').connection} param
*/
const someFunc = (param) => {}
另外,请注意 exports.unused = {}
在 types.js
文件中是必要的,否则 import('./types')
的自动导入将不起作用,您可能必须自己输入。