编写自定义TypeScript定义文件时,出现错误“模块'名称'解析为...处的无类型模块”。


89

我找不到@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;
}

但是,Visual Studio Code不断产生此错误,并将红线放在下面declare module 'node-helper-lib'

[ts]扩充中无效的模块名称。模块'node-helper-lib'解析为'{project path} \ node_modules \ node-helper-lib \ index.js'处的未类型化模块,无法对其进行扩充。

因为该库是无类型的,所以应该允许我在其中添加类型吗?

更新:

我在用:

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

Answers:


151

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

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

例:

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

21
这是否记录在某处?
克里斯

12
我不知道我花了几个小时才找到这个。非常感谢!绝对应该更好地记录这
件事

为什么TypeScript没有良好的错误消息或类似信息?
VitorLuizC

53

经过一番尝试和错误,我发现这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 '...' { ... }

我将发现留在这里,以防万一有人有同样的问题。如果我错过了一些事情,请纠正我。


1
如果第三方库已经包含定义文件.d.ts,但我想忽略它并使用自定义文件,该怎么办?
艾伦·梁

24
我正在尝试为一个完全无类型的npm模块编写一个定义文件,supertest— TypeScript的抱怨甚至都没有道理,我怎么能不增加甚至没有声明的内容呢?我以为我已经写过很多这样的自定义定义文件了…… [ts] Invalid module name in augmentation. Module 'supertest' resolves to an untyped module at '/home/chase/Desktop/projects/formuoli/node_modules/supertest/index.js', which cannot be augmented.–不幸的@types/supertest是,由于包含了使它坏掉的DOM库而被打破了。.看起来我很走运
ChaseMoskal

34
@ChaseMoskal:在您的文件中.d.ts,也许您应该将所有导入移动到声明模块“ moduleName” {}中。
Paleo

17
@Paleo就是这样,所有import调用都必须在declare module 'module' {}作用域内。该错误充其量是令人误解的
pocesar '17

2
如果您将import模块所需的语句放在declare module而不是在模块内部,则打字稿会执行相同的操作。这种不合常理的奇怪行为(对不起,在此不胜枚举)。
宾基

0

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


-4

就我而言,我只是在一个类型文件中使用了以下声明,因此我可以使用所有非类型脚本包:

declare module '*'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.