当我尝试导入Node.js的模块中打字稿这样的:如何在没有类型定义的情况下在Typescript中导入节点模块?
import co = require('co');
import co from 'co';
而不提供类型定义,这两条线的报告相同的错误:
error TS2307: Cannot find module 'co'.
如何正确导入呢?
当我尝试导入Node.js的模块中打字稿这样的:如何在没有类型定义的情况下在Typescript中导入节点模块?
import co = require('co');
import co from 'co';
而不提供类型定义,这两条线的报告相同的错误:
error TS2307: Cannot find module 'co'.
如何正确导入呢?
的诀窍是用纯粹的JavaScript符号:
const co = require('co');
你的选择是要么导入打字稿的模块系统外(通过调用模块API一样直接用手RequireJS或节点),因此它不”尝试验证它,或者添加一个类型定义,以便您可以使用模块系统并使其正确验证。尽管如此,你仍然可以对类型定义进行存根,所以这可能非常低效。
使用节点(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知道你在说什么。您仍然需要确保导入模块名称实际上是在运行时使用您正在使用的任何模块系统成功加载它,否则它将进行编译,但无法真正运行。
当我用在蒂姆·佩里的回答了“成株类型定义”的方法,我得到了一个错误: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';
创建自己的存根文件降低了在需要时写出真实声明的障碍。
你能解释一下我们应该把这个文件放在哪里(当存根类型定义的时候)以及哪个文件名?我不知道什么是“模块系统”,我猜打字稿不知道节点模块,所以我们应该告诉它们在哪里。 –
如何从'react-redux'创建一个满足导入类似'import {Provider}的存根的存根? – jbandi