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

时间:2016-05-03 09:53:42

标签: node.js typescript

当我尝试在Typescript中导入node.js模块时,如下所示:

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

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

error TS2307: Cannot find module 'co'.

如何正确导入?

4 个答案:

答案 0 :(得分:8)

您的选择是在TypeScript的模块系统之外导入它(通过直接手动调用RequireJS或Node等模块API),这样它就不会尝试验证它,或者添加类型定义,以便您可以使用模块系统并使其正确验证。您可以存根类型定义,因此这可能非常省力。

直接导入节点(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尝试管理模块你也是手工管理的。我建议使用这种方法,或者使用真实的类型定义。

存根类型定义:

获得正确的类型定义是最好的,如果这些是可用的,或者你有时间自己编写它们,你肯定应该这样做。

如果没有,你可以给你的整个模块any类型,并将你的模块放入模块系统而不必实际输入:

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

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

答案 1 :(得分:3)

诀窍是使用纯JavaScript表示法:

const co = require('co');

答案 2 :(得分:3)

当我使用&#34; Stubbing类型定义&#34;时出现错误在蒂姆佩里的回答中: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';

创建自己的存根文件可以降低在需要时写出实际声明的障碍。

答案 3 :(得分:0)

只需通过以下方式导入模块:

import 'co';