如何在没有types定义的情况下在Typescript中导入节点模块?

当我尝试像这样在Typescript中导入node.js模块时:

import co = require('co'); import co from 'co'; 

不提供types定义,两行都报告相同的错误:

 error TS2307: Cannot find module 'co'. 

如何正确导入?

您的select是将其导入到TypeScript的模块系统之外(通过手动直接调用像RequireJS或Node这样的模块API),以便它不会尝试validation它,或者添加一个types定义,以便您可以使用模块系统并validation它是正确的。 你可以将types定义存根,所以这可以是非常低的努力。

直接使用Node(CommonJS)导入:

 // Note there's no 'import' statement here. var loadedModule: any = require('module-name'); // Now use your module however you'd like. 

直接使用RequireJS:

 define(["module-name"], function (loadedModule: any) { // Use loadedModule however you'd like }); 

请注意,在这些情况下,这可能会混淆在同一个文件中使用实际的普通TypeScript模块导入(最终可能会有两层模块定义,特别是在RequireJS端,因为TypeScript试图pipe理模块也用手来pipe理)。 我build议使用这种方法,或使用真正的types定义。

存根types定义:

获得正确的types定义是最好的,如果这些定义是可用的,或者你有时间自己写,那么你一定要这样做。

如果没有,你可以给你的整个模块的anytypes,并把你的模块进入模块系统,而不必实际input:

 declare module 'module-name' { export = <any> {}; } 

这应该允许你导入module-name并让TypeScript知道你在说什么。 您仍然需要确保导入模块名称实际上是在运行时使用您正在使用的任何模块系统成功加载它,否则将会编译但实际上无法运行。

诀窍是使用纯粹的JavaScript符号:

 const co = require('co'); 

我在Tim Perry的回答中使用了“Stubbing type definitions”方法时遇到错误: error TS2497: Module ''module-name'' resolves to a non-module entity and cannot be imported using this construct.

解决方法是稍微修改存根.d.ts文件:

 declare module 'module-name' { const x: any; export = x; } 

然后你可以通过导入:

 import * as moduleName from 'module-name'; 

创build自己的存根文件降低了在需要时写出真正的声明的障碍。