在我的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.jstoolbox/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中,我可以看到NailnailCount显示为工具箱的一部分。

看到这张图片:
javascript - 使用TypeScript通过JSDocs检查JS时,如何声明变量对应于 namespace ?-LMLPHP

另外,为确保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 ?-LMLPHP

关于javascript - 使用TypeScript通过JSDocs检查JS时,如何声明变量对应于 namespace ?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60323040/

10-12 15:13