【问题标题】:If I'm adding typings to an npm module, how can I depend on global typings?如果我向 npm 模块添加类型,我如何依赖全局类型?
【发布时间】:2025-12-22 02:05:07
【问题描述】:

假设我写了一个节点模块,m。后来,我决定向它添加 Typescript 类型。好在模块只导出了一个函数,所以m.d.ts文件如下:

/// <reference path="./typings/globals/node/index.d.ts" />

declare module "m" {
  doThings(b: Buffer): int;

  export = doThings;
}

我的函数使用节点的Buffer,所以我在已安装的typings 文件夹中包含了对节点类型的有效引用(没有它,Sublime 给我“找不到名称'缓冲区'消息,这似乎很糟糕事情)。一切看起来都不错,所以我更新了我的package.json 中的typings 密钥并部署。

另外,我在一个单独的打字稿项目p 中使用模块m。我不必担心使用typings,因为我的模块包含了类型。当我运行tsc 时,我收到以下错误:node_modules/m/m.d.ts(6,1): error TS6053: File '/Users/$USER/projects/p/node_modules/m/typings/globals/node/index.d.ts' not found. 这很有意义,因为在node_modules 中没有typings 文件夹(我在印象中检查生成的文件夹是不鼓励的)。当一个类型文件被加载到DefinitelyTyped 中时,它会去掉所有的三斜杠引用(并且best practices 说你不应该将它们包含在d.ts 文件中)。当有一个类型文件加载到 npm 模块中时,什么都不会被剥离。

所以,我的问题是:我可以吃蛋糕吗?是否可以在我的模块 (m) 中有有效的类型,而不包括外部项目中的损坏引用 (p)?

非常感谢!

【问题讨论】:

    标签: javascript node.js typescript npm


    【解决方案1】:

    我的蛋糕也可以吃吗?是否可以在我的模块 (m) 中有有效的类型,而在外部项目 (p) 中不包括损坏的引用?

    您不包含node.d.ts 作为参考标记。相反,您指定人们需要在他们的编译上下文中包含node.d.ts,例如使用 tsconfig.json。

    【讨论】:

    • 很公平。这是否意味着我的模块中存在错误(它会抱怨不知道缓冲区),这很好吗?
    • Does that mean I live with errors in my module (it'll complain about not knowing buffer) and that's fine 没有。您的项目中也应该有 node.d.ts,并通过 tsconfig.json 包含在内。
    • 啊,我没想到要包含tsconfig,因为它不是打字稿项目,只是一个带有类型定义的js项目。感谢您的帮助!
    • 实际上,还有一件事,@basarat。我正在开发一个 ts 模块 (github.com/xavdid/word_count),然后我想将其用于其他事情。对于如何编写将由其他打字稿代码使用的模块,或者在包含或忽略各种文件时最佳实践是什么,似乎没有一个很好的指南。就目前而言,当我将该代码推送到 npm 并通过新模块要求时,我收到一条错误消息,显示为 Default export of the module has or is using private name 'Options'Options 未包含在我的 index.d.ts 中,但似乎需要?