考虑这个测试脚本。
#!/bin/bash -ex
rm -rf ts-async-await
mkdir ts-async-await
cd ts-async-await
npm init -y &> /dev/null
npm i --save-dev [email protected] &> /dev/null
echo "async function x() { return 1; }" > test.ts
echo '{ "compilerOptions": { "target": "es2017" } }' > tsconfig.json
npx tsc --version
npx tsc --showConfig
npx tsc test.ts
cat tsconfig.json
cat test.js
我正在使用单个单行 TypeScript 文件创建一个空目录,其中包含 async/await。
async function x() { return 1; }
然后,我创建一个
tsconfig.json
,其中 compilerOptions
target
设置为 es2017
。
{ "compilerOptions": { "target": "es2017" } }
tsc --showConfig
显示:
{
"compilerOptions": {
"target": "es2017"
},
"files": [
"./test.ts"
]
}
然后,我将我的
test.ts
文件转换为 test.js
。
预期:这个单行代码应该干净地转换为单行代码 JS 文件,就像在 TypeScript 游乐场中一样 https://www.typescriptlang.org/play?#code/IYZwngdgxgBAZgV2gFwJYHsIwB4AoCUMA3jAE4CmyCpWAjANwwC+QA
实际:TypeScript 生成 40 行代码,使用
async/await
和 async/await
帮助器将我的 __awaiter
代码降级为非 __generator
代码。
如何让我的示例 TypeScript 项目执行 Playground 的操作?为什么
target
在这里不为我做正确的事?
这是测试输出的完整日志:
+ rm -rf ts-async-await
+ mkdir ts-async-await
+ cd ts-async-await
+ npm init -y
+ npm i --save-dev [email protected]
+ echo 'async function x() { return 1; }'
+ echo '{ "compilerOptions": { "target": "es2017" } }'
+ npx tsc --version
Version 4.7.4
+ npx tsc --showConfig
{
"compilerOptions": {
"target": "es2017"
},
"files": [
"./test.ts"
]
}
+ npx tsc test.ts
+ cat tsconfig.json
{ "compilerOptions": { "target": "es2017" } }
+ cat test.js
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (_) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
function x() {
return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) {
return [2 /*return*/, 1];
}); });
}
Typescript either 作为 CLI 调用在文件上运行,or 在指定入口点的配置上运行,但不能同时运行(尝试运行
npx tsc test.js --p tsconfig.js
并查看获得的输出)。
因此,这会很好地工作:
> npx tsc test.ts --target esnext
这也能正常工作:
> npx tsc
或明确引用配置文件:
> npx tsc --p tsconfig.json
但是因为你在脚本中调用
npx tsc test.ts
,TypeScript 将完全忽略你的配置文件,只运行你在 CLI 语句中纯粹告诉它做的事情。
您可以尝试microsoft/TypeScript
问题27379
中的建议:
gustavopch/tsc-files
来自Gustavo
一个小工具,可以在特定文件上运行tsc
,而不忽略。tsconfig.json
在大多数情况下,它只是将所有参数转发到
,但有一个例外:指定的文件不会被转发 - 相反,它们将被放置在将在原始配置旁边生成的临时配置的 files 属性中tsc
。tsconfig.json