Node.js “有错误”;模块';名称';解析为位于…的非类型化模块;编写自定义类型脚本定义文件时

Node.js “有错误”;模块';名称';解析为位于…的非类型化模块;编写自定义类型脚本定义文件时,node.js,typescript,typescript-typings,typescript2.1,Node.js,Typescript,Typescript Typings,Typescript2.1,我找不到一个已安装的NodeJS包的TypeScript定义@type/{name},因此我尝试为它编写一个d.ts文件,并将该文件放在{project root}\typings文件夹中。我就是这样做的: // My source code: index.ts import Helper from 'node-helper-lib'; // My definition: \typings\node-helper-lib.d.ts declare....(something else) d

我找不到一个已安装的NodeJS包的TypeScript定义
@type/{name}
,因此我尝试为它编写一个
d.ts
文件,并将该文件放在
{project root}\typings
文件夹中。我就是这样做的:

// My source code: index.ts
import Helper from 'node-helper-lib';


// My definition: \typings\node-helper-lib.d.ts
declare....(something else)

declare module 'node-helper-lib' {
   class Helper { ... }
   export = Helper;
}
但是,Visual Studio代码不断产生此错误,并将红线置于声明模块“节点帮助器库”下。

[ts]扩充中的模块名称无效。模块“节点帮助器库” 解析为“{project”处的非类型化模块 路径}\node\u modules\node helper lib\index.js',不能为 增强的

因为库是非类型化的,所以应该允许我向其中添加类型,这难道不合法吗

更新:

我正在使用:

  • 打字稿:2.1.4
  • Visual Studio代码:1.9.1
  • 节点JS:6.9.4
  • Windows 10 x64

经过一些尝试和错误之后,我发现
增强
意味着“在同一文件中声明一个模块,并声明其他模块”

因此,如果我们想为非类型的第三方JavaScript库编写定义文件,则该文件中必须只有一个
声明模块“lib name”
,并且“lib name”必须与库名称完全匹配(可以在其package.json,“name”属性中找到)

另一方面,如果第三方库已经包含定义文件
.d.ts
,并且我们希望扩展其功能,那么我们可以将附加定义放在我们创建的另一个文件中。这称为增强

例如:

// These module declarations are in same file, given that each of them already has their own definition file.
declare module 'events' {
   // Extended functionality
}

declare module 'querystring' {
   // Extended functionality        
}

declare module '...' { ... }

我把我的发现留在这里,以防万一有人有同样的问题。如果我遗漏了什么,请纠正我。

实际解决方案在@hirikarate的回答中由@Paleo给出:

导入应在模块声明中声明。

例如:

declare module 'node-helper-lib' {
   import * as SomeThirdParty from 'node-helper-lib';
   interface Helper {
       new(opt: SomeThirdParty.Options): SomeThirdParty.Type
   }
   export = Helper;
}

我也收到了那个错误信息。我遇到的问题是,我试图在现有类型定义文件中声明另一个模块,该文件中包含模块声明。在我将新模块声明移动到一个新文件后,错误消失了。

在我的例子中,我只是在我的一个类型文件中使用了以下声明,因此我能够使用所有非类型脚本包:

declare module '*'

我遇到的问题是,我试图在
.ts
文件中声明模块。我将其更改为
.d.ts
,一切正常。

如果第三方库已经包含了定义文件.d.ts,但我想忽略它并使用自定义文件,我该怎么办?我正在尝试为完全非类型化的npm模块编写定义文件,
supertest
-TypeScript的抱怨根本没有意义,我怎么能不添加甚至没有声明的内容呢?我想我已经写过很多次这样的自定义定义文件了<代码>[ts]扩充中的模块名称无效。模块“supertest”解析为“/home/chase/Desktop/projects/formuoli/node_modules/supertest/index.js”中的非类型化模块,无法对其进行扩充。-不幸的是,
@types/supertest
由于包含DOM库而被破坏。。看来我没钱了luck@ChaseMoskal:在您的文件
.d.ts
中,也许您应该将所有导入移到declare模块“moduleName”{}中。正是这样,所有
import
调用都必须进入
declare模块“module”{}
范围内。如果您将模块所需的
import
语句放在
declare模块
之外,而不是放在模块内部,则错误在besttypescript中会产生误导。这种非直觉的奇怪行为(很抱歉在这里咆哮)。这是第二十二条军规。无法导入
somemodulehere
,因为它没有声明。无法创建声明来扩充它,因为它是一个
非类型化模式
。上面的示例将抛出2个错误。第一个原因是您无法扩充
节点帮助程序库
,第二个原因是它找不到用于导入的声明文件。自我编写该文件以来,它可能已更改。这对我很有帮助,谢谢!