【发布时间】:2019-06-05 20:05:33
【问题描述】:
开始将 Node.js 项目从普通 ES6 迁移到 TypeScript。
我做了什么:
npm install -g typescript
npm install @types/node --save-dev
设置tsconfig.json:
{
"compilerOptions": {
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"moduleResolution": "node",
"module": "commonjs",
"target": "es6",
"sourceMap": true,
"outDir": "dist",
"allowJs": true,
"forceConsistentCasingInFileNames": true
},
"exclude": [
"node_modules",
"dist",
"docs"
]
}
将所有文件扩展名从.js 更改为.ts(node_modules 除外):
find . -not \( -path node_modules -prune \) -iname "*.js" -exec bash -c 'mv "$1" "${1%.js}".ts' - '{}' \;
现在运行 tsc 会导致大量错误,例如:
server.ts:13:7 - error TS2451: Cannot redeclare block-scoped variable 'async'.
13 const async = require('async');
~~~~~
或者这些:
bootstrap/index.ts:8:7
8 const async = require('async');
~~~~~
'async' was also declared here.
更新:
retry 和其他 npm 包也会发生同样的情况:
const retry = require('retry');
将 require 语句更改为 ES6 import 语句主要解决了这些问题,但一次迁移数千个文件是不可行的,所以我需要一种方法来坚持使用 require 一段时间。这可能吗?
【问题讨论】:
-
我猜是因为 async/await 都是 typescript 中的两个关键字,所以您不能将变量命名为
async。顺便说一句,在相关说明中,您可能希望完全停用异步库,并将 async/await 与基于 Promise 的构造一起使用。 -
是的,
async/await绝对是一个目标,但首先我需要在没有错误的情况下编译所有内容,并且必须尽可能少地进行更改。 -
我更新了 OP:名称
async本身并不是问题的原因,retry包和所有其他包也会发生同样的情况,即使是本地模块也是如此。
标签: node.js typescript typescript3.0