Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何在没有类型定义的情况下导入Typescript中的节点模块?_Node.js_Typescript - Fatal编程技术网

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

Node.js 如何在没有类型定义的情况下导入Typescript中的节点模块?,node.js,typescript,Node.js,Typescript,当我尝试像这样在Typescript中导入node.js模块时: import co = require('co'); import co from 'co'; 在不提供类型定义的情况下,两行报告相同的错误: error TS2307: Cannot find module 'co'. 如何正确导入它?诀窍是使用纯JavaScript表示法: const co = require('co'); 您可以选择在TypeScript的模块系统之外导入它(通过手动直接调用模块API,如Requir

当我尝试像这样在Typescript中导入node.js模块时:

import co = require('co');
import co from 'co';
在不提供类型定义的情况下,两行报告相同的错误:

error TS2307: Cannot find module 'co'.

如何正确导入它?

诀窍是使用纯JavaScript表示法:

const co = require('co');

您可以选择在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.
define(["module-name"], function (loadedModule: any) {
    // Use loadedModule however you'd like
});
直接使用RequireJS:

// Note there's no 'import' statement here.
var loadedModule: any = require('module-name');

// Now use your module however you'd like.
define(["module-name"], function (loadedModule: any) {
    // Use loadedModule however you'd like
});
请注意,在上述任何一种情况下,这都可能与在同一文件中使用真正的普通TypeScript模块导入相混淆(最终可能会有两层模块定义,尤其是在RequireJS端,因为TypeScript试图管理您也在手动管理的模块)。我建议只使用这种方法,或者使用实类型定义

存根类型定义:

// Note there's no 'import' statement here.
var loadedModule: any = require('module-name');

// Now use your module however you'd like.
define(["module-name"], function (loadedModule: any) {
    // Use loadedModule however you'd like
});
获得正确的类型定义是最好的,如果这些定义可用,或者您有时间自己编写它们,您肯定应该这样做

如果不是这样,您可以将整个模块设置为
any
类型,并将模块放入模块系统中,而无需实际键入:

declare module 'module-name' {
    export = <any> {};
}
声明模块“模块名称”{
导出={};
}

这应该允许您导入
模块名称
,并让TypeScript知道您在说什么。您仍然需要确保导入模块名确实在运行时使用您正在使用的任何模块系统成功加载它,或者它将编译,但实际运行失败。

我在使用“存根类型定义”时出错Tim Perry回答中的方法:
错误TS2497:模块“模块名”解析为非模块实体,无法使用此构造导入。

解决方案是稍微修改存根
.d.ts
文件:

declare module 'module-name' {
  const x: any;
  export = x;
}
然后您可以通过以下方式导入:

import * as moduleName from 'module-name';

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

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

import 'co';

你能解释一下我们应该把这个文件放在哪里(在存根类型定义时),以及用哪个文件名吗?我不知道什么是“模块系统”,我想typescript不知道节点模块,所以我们应该知道它们在哪里。如何创建满足导入(如
import{Provider})的存根从“react redux”
?如果我将建议的存根代码放入d.ts文件中,我会得到错误TS2714:导出分配的表达式必须是环境上下文中的标识符或限定名。这会给我一个错误TS2306:文件“module name”不是模块。注意,我试图从本地文件目录而不是模块导入。