即使目标为:es2017,TypeScript 也会不断地转译异步/等待

问题描述 投票:0回答:2

考虑这个测试脚本。

#!/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];
    }); });
}
javascript typescript async-await
2个回答
6
投票

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 语句中纯粹告诉它做的事情。


0
投票

您可以尝试microsoft/TypeScript问题27379

中的
建议

:

gustavopch/tsc-files
来自Gustavo

一个小工具,可以在特定文件上运行 
tsc,而不忽略
tsconfig.json

在大多数情况下,它只是将所有参数转发到

tsc
,但有一个例外:指定的文件不会被转发 - 相反,它们将被放置在将在原始配置旁边生成的临时配置的 files 属性中
 tsconfig.json

© www.soinside.com 2019 - 2024. All rights reserved.