Javascript Node.js+;类型脚本:类型脚本编译代码语法不清晰
我试图在我的节点项目中使用TypeScript,但我有一些问题 这是我的index.ts文件: 我在跑步: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
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模块的所有导出属性添加到该列表中。使用默认导出是不正确的原始问题中的code>正是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();