Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/361.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.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
Javascript Node.js+;类型脚本:类型脚本编译代码语法不清晰_Javascript_Node.js_Typescript_Es6 Module Loader - Fatal编程技术网

Javascript Node.js+;类型脚本:类型脚本编译代码语法不清晰

Javascript Node.js+;类型脚本:类型脚本编译代码语法不清晰,javascript,node.js,typescript,es6-module-loader,Javascript,Node.js,Typescript,Es6 Module Loader,我试图在我的节点项目中使用TypeScript,但我有一些问题 这是我的index.ts文件: 我在跑步: tsc --module commonsjs -d index.ts 我的输出是index.js: 这个[“默认值”]来自哪里?这使我的代码无法正常运行: var app = express_1["default"](); ^ TypeError: express_1.default is not a fu

我试图在我的节点项目中使用TypeScript,但我有一些问题

这是我的index.ts文件:

我在跑步:

tsc --module commonsjs -d index.ts
我的输出是index.js:

这个
[“默认值”]
来自哪里?这使我的代码无法正常运行:

var app = express_1["default"]();
                              ^

TypeError: express_1.default is not a function
据我所知,我应该得到没有“默认”括号的代码,它会工作得很好-我尝试删除括号,它工作得很好


我在这里遗漏了什么?

最安全的解决方案是:

import express = require('express');
这将传递给:

var express = require('express');
可以找到进口要求申报的官方文件

从最后一段来看,我相信TypeScript期望一个名为“default”的导出能够像上面的代码一样工作


旁注:它看起来像是TypeScript的最新版本(typescript@1.8.0-dev.20151229(在编写本文时)将在试图使用缺少的默认值的编译尝试上抛出警告:

index.ts(1,8): error TS1192: Module '"express"' has no default export.

旁注2:来自Microsoft的一个示例,使用“express”中的
import*作为express语法。当以
commonjs
模块为目标时(如本例所示),这也将传输到
var express=require('express')


如果您至少有TypeScript 2.7,并且目标是CommonJS,那么也可以使用

从链接:

为了给用户提供与Babel或Webpack相同的运行时行为,TypeScript在发送到旧模块格式时提供了一个新的--esModuleInterop标志

在new--esModuleInterop标志下,这些可调用的CommonJS模块必须作为默认导入导入,如下所示:

我们强烈建议Node.js用户将此标志与诸如Express.js之类的库的CommonJS模块目标结合使用,后者导出可调用/可构造的模块


如果试图使用Express.js等非ES6模块的默认导出,则需要使用传统的导入语法
import Express=require('Express')

在ES6模块中,没有像Node.js模块的
模块那样的默认值导出。导出
,或者AMD模块的
返回
;ES6模块的默认导出只是
default
键。这就是为什么当您尝试使用ES6默认值导入时,TypeScript会生成JavaScript并访问
default
属性


有关这方面的详细信息,请访问。

如果仍要使用
导入
关键字,请像以下那样使用它:

import express from "express"; 
// If the above is not supported by your project environment then follow as below
import * as express from "express";
在文件
tsconfig.json中

{
  "compilerOptions": {
    ...   
    "module": "commonjs"
    ...
  }
}

多亏了。

我通过在
tsconfig.json
中添加以下内容解决了这个问题:

{
  "compilerOptions": {
    ... 
    "module": "commonjs",
    "esModuleInterop": true,
    ...
  }
}
esModuleInterop标志被描述为:“针对运行时babel生态系统兼容性的Emit uu importStar和u importDefault帮助程序,以及针对typesystem兼容性的enable--allowSyntheticDefaultImports。”


另一个适合您的解决方案是这样做:

import * as express from express;
const app = express();

它应该以同样的方式工作。

import*
是导入旧模块的错误方式。请参阅。考虑使用ESMeuleEndoP:Tror编译器选项(将其设置在TSCONFIG上)。这允许您按照预期从“express”导入express,谢谢!多亏了你,我对这个问题做了一些研究。我不明白你为什么接受另一个答案作为正确答案。这是错误的答案。如果对于当前版本的Typescript,这确实是错误的答案,那么我建议您让Microsoft编辑他们的示例。@dvlsg,Microsoft示例与OP所做的不同!该示例仅使用
express
中的
static
属性,它不尝试使用默认导出(因为它不能,因为它错误且不起作用)。在这种情况下,
import*
可以,因为它使导入的
express
标识符成为一个空白列表,然后根据ES规范将express模块的所有导出属性添加到该列表中。使用默认导出是不正确的正是Microsoft正在做的事情(当然,减去常量)。我同意
require
将在更多的场景中工作,但是,因此我将进行相应的编辑。模块应该是
commonjs
,而不是
commonjs
。这可能会给你带来一个问题。考虑使用EsMeuleEndoP:Trac编译器选项(将其设置在TSCONFIG上)。这允许您按预期从“express”导入express,确保tsconfig.json中有“module”:“commonJS”。这解决了我的问题!我可能知道正在使用TypeScript的配置,所以我添加了一个
tsconfig.json
文件。谢谢这应该是公认的答案,因为它允许简单地使用
从“express”导入express
我同意这是新版本typescript的正确策略。该选项直到2018年推出的typescript 2.7才可用。这应该是公认的答案。
{
  "compilerOptions": {
    ...   
    "module": "commonjs"
    ...
  }
}
{
  "compilerOptions": {
    ... 
    "module": "commonjs",
    "esModuleInterop": true,
    ...
  }
}
import * as express from express;
const app = express();