Shi*_*shi 11 javascript node.js typescript es6-module-loader
我正在尝试在我的节点项目中使用Typescript,但是遇到了一些问题.
这是我的index.ts文件:
import express from 'express';
const app = express();
Run Code Online (Sandbox Code Playgroud)
我在跑:
tsc --module commonsjs -d index.ts
Run Code Online (Sandbox Code Playgroud)
我的输出是index.js:
var express_1 = require('express');
var app = express_1["default"]();
Run Code Online (Sandbox Code Playgroud)
这["default"]是从哪里来的?它使我的代码无法正常运行:
var app = express_1["default"]();
^
TypeError: express_1.default is not a function
Run Code Online (Sandbox Code Playgroud)
据我所知,我应该得到没有"默认"括号的代码,它会工作正常 - 我尝试删除括号,它的工作原理.
我在这里错过了什么?
dvl*_*lsg 20
最安全的解决方案是:
import express = require('express');
Run Code Online (Sandbox Code Playgroud)
这转化为:
var express = require('express');
Run Code Online (Sandbox Code Playgroud)
可以在此处找到导入需要声明的官方文档.
我相信typescript期望一个名为"default"的导出作为上面的代码,从这里的最后一段来看.
旁注,看起来像打字稿的最新版本(撰写本文时为typescript@1.8.0-dev.20151229)将在编译尝试时发出警告,该尝试将尝试使用缺少的默认值:
index.ts(1,8): error TS1192: Module '"express"' has no default export.
Run Code Online (Sandbox Code Playgroud)
附注2,import * as express from 'express';可以在此处找到Microsoft使用语法的示例.当定位的模块commonjs(如它们是在该示例中),这也将transpile到var express = require('express');.
我通过添加以下内容来解决此问题tsconfig.json:
{
"compilerOptions": {
...
"module": "commonjs",
"esModuleInterop": true,
...
}
}
Run Code Online (Sandbox Code Playgroud)
所述esModuleInterop标志被描述为:“的Emit __importStar和__importDefault助手用于运行时巴贝尔生态系统的相容性和使能类型系统兼容性--allowSyntheticDefaultImports”。
https://www.typescriptlang.org/docs/handbook/compiler-options.html
如果您尝试使用非ES6模块(如Express)的默认导出,则需要使用旧版import语法import express = require('express')。在ES6模块中,没有默认值导出,例如module.exportsNode.js模块或returnAMD模块。ES6模块的默认导出只是default关键。这就是为什么当您import尝试使用默认的ES6时,TypeScript生成具有对该default属性访问权限的JavaScript的原因。
有关此问题的更多信息,请参见用于导入commonjs / amd模块的新es6语法,即“ import foo = require('foo')”。
如果您仍然想使用该import关键字,请像这样使用它:
import express from "express";
// If the above is not supported by your project environment then follow as below
import * as express from "express";
Run Code Online (Sandbox Code Playgroud)
在文件中tsconfig.json
{
"compilerOptions": {
...
"module": "commonjs"
...
}
}
Run Code Online (Sandbox Code Playgroud)
感谢乔什·丹多。