Node.js “有错误”;模块';名称';解析为位于…的非类型化模块;编写自定义类型脚本定义文件时
我找不到一个已安装的NodeJS包的TypeScript定义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
@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个错误。第一个原因是您无法扩充节点帮助程序库
,第二个原因是它找不到用于导入的声明文件。自我编写该文件以来,它可能已更改。这对我很有帮助,谢谢!