26

我正在尝试在我的节点项目中使用 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

据我了解,我应该得到没有“默认”括号的代码,它会工作得很好 - 我尝试删除括号并且它工作。

我在这里想念什么?

4

5 回答 5

36

最安全的解决方案是:

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:import * as express from 'express';可以在此处找到 Microsoft 使用该语法的示例。当针对commonjs(如本例的)模块时,这也将转换为var express = require('express');.


如果你至少有 TypeScript 2.7 并且以 CommonJS 为目标,你也可以使用esModuleInterop

从链接:

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

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

import express from "express";

let app = express();

我们强烈建议 Node.js 用户将此标志与 CommonJS 的模块目标一起用于 Express.js 等库,这些库导出可调用/可构造的模块。

于 2015-12-29T23:44:13.990 回答
34

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

{
  "compilerOptions": {
    ... 
    "module": "commonjs",
    "esModuleInterop": true,
    ...
  }
}

esModuleInterop标志描述为:“发出__importStar和 __importDefault 帮助程序以实现运行时 babel 生态系统兼容性,并启用 --allowSyntheticDefaultImports 以实现类型系统兼容性。”

https://www.typescriptlang.org/docs/handbook/compiler-options.html

于 2019-06-25T18:38:20.143 回答
7

如果您尝试使用 Express.js 等非 ES6 模块的默认导出,则需要使用旧版导入语法import express = require('express')

在 ES6 模块中,没有像module.exportsNode.js 模块或returnAMD 模块那样的默认值导出;ES6 模块的默认导出只是default关键。import这就是为什么当您尝试使用 ES6 默认值时,TypeScript 会生成具有对该default属性的访问权限的 JavaScript。

有关这方面的更多信息,请参阅用于导入 commonjs / amd 模块的新 es6 语法,即 `import foo = require('foo')`

于 2015-12-30T04:17:21.160 回答
4

如果您仍想使用import关键字,请使用它:

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"
    ...
  }
}

谢乔什丹多

于 2018-10-12T04:52:04.713 回答
0

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

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

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

于 2020-04-17T21:48:27.767 回答