在编写自定义TypeScript定义文件时,出现错误"模块'名称'解析为无类型模块..."

hir*_*ate 57 node.js typescript typescript-typings typescript2.1

我找不到@type/{name}我安装的NodeJS软件包的TypeScript定义,因此我尝试为其编写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;
}
Run Code Online (Sandbox Code Playgroud)

但是,Visual Studio代码不断产生此错误并将红线置于declare module 'node-helper-lib':

[ts]增强中的模块名称无效.模块'node-helper-lib'解析为'{project path} \node_modules \node-helper-lib\index.js'中的无类型模块,该模块无法扩充.

这是不合法的,因为库是无类型的,所以我应该被允许添加输入?

更新:

我在用:

  • TypeScript:2.1.4
  • Visual Studio代码:1.9.1
  • 节点JS:6.9.4
  • Windows 10 x64

Lee*_*son 92

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

进口应声明里面的模块声明.

例:

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

  • 这是在某处记录的吗? (10认同)
  • 我不知道我花了几个小时才找到这个。非常感谢!绝对应该更好地记录下来... (6认同)
  • 这是第 22 条军规。无法导入“somemodulehere”,因为它没有声明。无法创建声明来扩充它,因为它是“非类型化模块”。上面的例子会抛出 2 个错误。第一个是您无法扩充“node-helper-lib”,第二个是它找不到导入的声明文件。 (4认同)

hir*_*ate 34

经过一些尝试和错误后,我发现这augmentation意味着"在与其他模块声明相同的文件中声明一个模块".

因此,如果我们要为无类型的第三方JavaScript库编写定义文件,那么我们必须declare module 'lib-name'在该文件中只有一个,并且'lib-name'必须与库名完全匹配(可以在其package.json中找到,"名称"财产".

另一方面,如果第三方库已经包含定义文件 .d.ts,并且我们想要扩展其功能,那么我们可以将附加定义放在我们创建的另一个文件中.这叫做augmenting.

例如:

// 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 '...' { ... }
Run Code Online (Sandbox Code Playgroud)

我在这里留下我的发现,以防有人有同样的问题.如果我错过了什么,请纠正我.

  • @ChaseMoskal:在你的文件`.d.ts`中,也许你应该将所有导入移动到声明模块"moduleName"{}中. (28认同)
  • 我正在尝试为完全无类型的npm模块编写一个定义文件,`supertest` - TypeScript的投诉甚至没有意义,我怎么能不增加甚至没有声明的东西呢?我以为我已经多次编写了这样的自定义定义文件...`[ts]扩充中的模块名称无效.模块'supertest'解析为'/home/chase/Desktop/projects/formuoli/node_modules/supertest/index.js'中的无类型模块,该模块无法扩充. - 不幸的是`@ types/supertest`被包括DOM破坏了图书馆让它破碎..看起来我运气不好 (20认同)
  • @Paleo就是这样,所有`import`调用必须进入`declare module'模块'{}`范围.这个错误充其量是误导性的 (13认同)
  • 如果您将模块所需的“ import”语句放在`declare module`之外而不是其中,typescript也会做同样的事情。这种不合常理的奇怪行为(对不起,在此不胜枚举)。 (2认同)

Oma*_*iri 9

对我来说,问题是我试图在.ts文件中声明该模块。我把它改成了.d.ts,一切都很好。


G-W*_*Wiz 6

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