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

d6kp6zgx  于 2022-12-14  发布在  TypeScript
关注(0)|答案(4)|浏览(203)

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

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

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

error TS2307: Cannot find module 'co'.

如何正确导入?

7fyelxc5

7fyelxc51#

诀窍是使用纯JavaScript表示法:

const co = require('co');
6kkfgxo0

6kkfgxo02#

您可以选择在TypeScript的模块系统之外导入它(通过直接手动调用模块API,如RequireJS或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试图管理您也在手动管理的模块)。我建议您要么使用这种方法,要么使用真正的类型定义。

存根类型定义:

获得适当的类型定义将是最好的,如果这些是可用的,或者你有时间自己编写它们,你肯定应该。
如果不是这样,你可以给你的整个模块指定any类型,然后把你的模块放到模块系统中,而不需要实际输入它:

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

这将允许您导入module-name,并让TypeScript知道您在说什么。您仍然需要确保导入module-name确实在运行时成功地加载了它,无论您使用的是什么模块系统,否则它将编译,但随后无法实际运行。

g52tjvyc

g52tjvyc3#

当我在Tim佩里的答案中使用“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';

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

zbq4xfa0

zbq4xfa04#

只需按以下方式导入模块:

import 'co';

相关问题