当我尝试在TypeScript中导入node.js模块时,如下所示:
import co = require('co'); import co from 'co';
如果不提供类型定义,则两行都报告相同的错误:
error TS2307: Cannot find module 'co'.
如何正确导入?
7fyelxc51#
诀窍是使用纯JavaScript表示法:
const co = require('co');
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类型,然后把你的模块放到模块系统中,而不需要实际输入它:
any
declare module 'module-name' { export = <any> {}; }
这将允许您导入module-name,并让TypeScript知道您在说什么。您仍然需要确保导入module-name确实在运行时成功地加载了它,无论您使用的是什么模块系统,否则它将编译,但随后无法实际运行。
module-name
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:
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';
创建自己的存根文件可以降低在需要时写出真实的声明的障碍。
zbq4xfa04#
只需按以下方式导入模块:
import 'co';
4条答案
按热度按时间7fyelxc51#
诀窍是使用纯JavaScript表示法:
6kkfgxo02#
您可以选择在TypeScript的模块系统之外导入它(通过直接手动调用模块API,如RequireJS或Node),这样它就不会试图验证它,或者添加一个类型定义,这样您就可以使用模块系统并正确地验证它。您可以存根类型定义,因此这可能非常简单。
直接使用节点(CommonJS)导入:
直接使用RequireJS:
请注意,在这两种情况下,这可能会与在同一个文件中使用真实的正常TypeScript模块导入奇怪地混合在一起(您可能会以两层模块定义结束,特别是在RequireJS端,因为TypeScript试图管理您也在手动管理的模块)。我建议您要么使用这种方法,要么使用真正的类型定义。
存根类型定义:
获得适当的类型定义将是最好的,如果这些是可用的,或者你有时间自己编写它们,你肯定应该。
如果不是这样,你可以给你的整个模块指定
any
类型,然后把你的模块放到模块系统中,而不需要实际输入它:这将允许您导入
module-name
,并让TypeScript知道您在说什么。您仍然需要确保导入module-name确实在运行时成功地加载了它,无论您使用的是什么模块系统,否则它将编译,但随后无法实际运行。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
:然后您可以通过以下方式导入:
创建自己的存根文件可以降低在需要时写出真实的声明的障碍。
zbq4xfa04#
只需按以下方式导入模块: