我正在尝试在我的节点项目中使用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
据我了解,我应该在没有“默认”括号的情况下获得代码并且它可以正常工作 - 我尝试删除括号并且它有效。
我在这里缺少什么?
答案 0 :(得分:18)
最安全的解决方案是:
import express = require('express');
这转化为:
var express = require('express');
可以找到导入需要声明的官方文档here。
我相信打字稿需要一个名为"默认"从最后一段here判断,作为上面的代码。
附注,看起来像打字稿的最新版本(撰写本文时为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示例here。在定位commonjs
模块时(在此示例中为they are),这也将转换为var express = require('express');
。
答案 1 :(得分:4)
如果您尝试使用Express等非ES6模块的默认导出,则需要使用旧版导入语法module.exports
。在ES6模块中,没有默认值导出,如Node.js模块的return
或AMD模块的default
; ES6模块的默认导出只是import
键。这就是为什么当您尝试使用ES6默认default
时,TypeScript会生成具有ArrayList
属性访问权限的JavaScript。
有关此内容的更多信息,请访问outlined here。
答案 2 :(得分:1)
如果您仍然想使用import
关键字,请像这样使用
import express from "express";
// if above is not supported by your project environment then follow as below
import * as express from "express";
在tsconfig.json
{
"compilerOptions": {
...
"module": "commonjs"
...
}
}
感谢@Josh Dando
答案 3 :(得分:0)
我通过将以下内容添加到tsconfig.json
中来解决了这个问题:
{
"compilerOptions": {
...
"module": "commonjs",
"esModuleInterop": true,
...
}
}
esModuleInterop 标志的描述如下:“发出__importStar和__importDefault帮助程序以实现运行时babel生态系统兼容性,并启用--allowSyntheticDefaultImports以实现类型系统兼容性。”
https://www.typescriptlang.org/docs/handbook/compiler-options.html
答案 4 :(得分:0)
另一个可能适合您的解决方案是这样做:
import * as express from express;
const app = express();
它应该以相同的方式工作。