Node.js + TypeScript:类型脚本编译代码的语法不清晰

Node.js + TypeScript: Unclear syntax with type script compiled code

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

可以找到导入要求声明的官方文档here

从最后一段 here 判断,我相信 TypeScript 期望一个名为“default”的导出作为您上面的代码运行


旁注:看起来 TypeScript 的最新版本(在撰写本文时为 typescript@1.8.0-dev.20151229)将在尝试使用缺少的默认值的编译尝试时发出警告:

index.ts(1,8): error TS1192: Module '"express"' has no default export.

旁注 2:可以在 here. When targeting a module of commonjs (as they are 中找到 Microsoft 使用 import * as express from 'express'; 语法的示例),这也将转换为 var express = require('express');.


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

来自link:

To give users the same runtime behavior as Babel or Webpack, TypeScript provides a new --esModuleInterop flag when emitting to legacy module formats.

Under the new --esModuleInterop flag, these callable CommonJS modules must be imported as default imports like so:

import express from "express";

let app = express();

We strongly suggest that Node.js users leverage this flag with a module target of CommonJS for libraries like Express.js, which export a callable/constructable module.

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

在ES6模块中,没有像Node.js模块的module.exports或AMD模块的return那样的默认值导出; ES6 模块的默认导出只是 default 键。这就是为什么当您尝试使用 ES6 默认值 import 时,TypeScript 生成 JavaScript 并可以访问 default 属性.

有关此内容的更多信息,请访问

如果您仍想使用 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"
    ...
  }
}

感谢

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

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

esModuleInterop 标志描述为:"Emit __importStar and __importDefault helpers for runtime babel ecosystem compatibility and enable --allowSyntheticDefaultImports for typesystem compatibility."

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

另一种适合您的解决方案是这样做的:

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

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