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