在我的JS代码中,我导入了一个模块,如下所示:
const toolbox = require('../toolbox')
/**
* @param {toolbox.Hammer} hammer
*/
function useHammer(hammer) {
let nail = new toolbox.Nail()
hammer.ham(nail)
}
现在,因为我的
tools/index.d.ts
文件将toolbox
导出为名称空间。我的IDE可以看到hammer
上有方法ham
。太棒了!但是它看不到toolbox
中有成员Nail
。我尝试将
@module
和@export
标记放在toolbox/index.js
中无济于事。我还尝试在@type {toolbox}
语句的顶部放置一个require
,但有人告诉我toolbox is referenced directly or indirectly in its own type annotation
。如何让我的IDE知道
toolbox = require('toolbox')
使toolbox
对应于我的命名空间?一个示例
toolbox/index.js
和toolbox/index.d.ts
供参考:exports.Hammer = class {
ham (nail) {
if (Math.random() > 0.1) {
exports.nailCount -= 1
return 'bang!'
} else return 'Ouch my thumb!'
}
}
exports.nailCount = 100
exports.Nail = class {}
export = toolbox
export as namespace toolbox
declare namespace toolbox {
class Nail {}
class Hammer {
ham(n: Nail) : string
}
}
和我的tsconfig效果很好(因为有点杂货)
{
"compilerOptions": {
"allowJs": true,
"target": "es5",
"checkJs": true,
"baseUrl": "../",
"moduleResolution": "node",
"noEmit": true
}
}
最佳答案
您正在使用哪个IDE?
在VS Code中,我可以看到Nail
和nailCount
显示为工具箱的一部分。
看到这张图片:
另外,为确保hammer.ham
函数仅接受Nail
实例,请在Nail
中的index.d.ts
类定义中添加一些属性。
例如。
// toolbox/index.d.ts
export = toolbox;
export as namespace toolbox;
declare namespace toolbox {
class Nail {
length: string; // new property added
}
class Hammer {
ham(n: Nail): string;
}
}
现在,在
main/index.js
中,如果传递除Nail
实例以外的任何内容,则会收到错误消息。例如
const toolbox = require("../toolbox");
/**
* @param {toolbox.Hammer} hammer
*/
function useHammer(hammer) {
let nail = new toolbox.Nail();
hammer.ham("nail-string"); // this will show a red squiggle under "nail-string" since it is a string and the compiler expected a Nail instance
}
看到这张图片:
关于javascript - 使用TypeScript通过JSDocs检查JS时,如何声明变量对应于 namespace ?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60323040/