当我尝试像这样在TypeScript中导入node.js模块:
import co = require('co');
import co from 'co';
没有提供类型定义,两行代码报告相同的错误:
error TS2307: Cannot find module 'co'.
如何正确导入它?
当我尝试像这样在TypeScript中导入node.js模块:
import co = require('co');
import co from 'co';
没有提供类型定义,两行代码报告相同的错误:
error TS2307: Cannot find module 'co'.
如何正确导入它?
窍门是使用纯JavaScript表示:
const co = require('co');
你的选择是要么在 TypeScript 的模块系统之外导入它(通过手动调用像 RequireJS 或 Node 这样的模块 API),以便它不尝试验证它,要么添加一个类型定义,以便你可以使用模块系统并使其正确验证。你可以对类型定义进行存根,因此这可以非常轻松。
直接使用 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 在运行时能够成功加载它,否则它会编译但无法真正运行。
当我使用Tim Perry答案中的"Stubbing type definitions"方法时,我遇到了错误:error TS2497: 模块''module-name''解析为非模块实体,无法使用此结构导入。
解决方案是稍微修改.d.ts
文件的存根:
declare module 'module-name' {
const x: any;
export = x;
}
然后您可以通过以下方式进行导入:
import * as moduleName from 'module-name';
2023年以后的读者都知道,你可以导入它(就像require一样),但必须指定扩展名。例如
import './sockets.js'
只需以以下方式导入模块:
import 'co';
import {Provider} from 'react-redux'
导入的存根? - jbandi