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();
它应该以同样的方式工作。
我正在尝试在我的节点项目中使用 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();
它应该以同样的方式工作。