【问题标题】:What's up with some typescript 3.7 features not being available if you target ESNext?如果您以 ESNext 为目标,某些 typescript 3.7 功能不可用是怎么回事?
【发布时间】:2020-05-11 21:28:14
【问题描述】:

我在我的 Angular 项目中使用 bigint 文字,仅在 ESNext 中可用,但由于某种原因,讨论的空合并运算符 here 在定位 ESNext 时似乎不可用。

   this._id = id ?? Util.makeGuid()

在编译阶段给出错误TS1109 : Expression expected,第二个问号下面有一点红色波浪。

我不明白为什么会这样。我以为 ESNext 应该是针对最新的 javascript 版本的,为什么这些新功能不可用?

例如,试试typescript playground 中的这段代码,它在设置为 V3.7.2 并以 ES2017 为目标时运行良好。

class Foo {
    name: string;
    constructor(name?: string) {
        this.name = name ?? "I am Foo";
    }
}

let f = new Foo();
alert(f.name);

但如果使用“配置”选项卡将目标设置为 ESNext,代码将失败并在控制台中出现语法错误。

我的 Chrome 版本是:

Google Chrome is up to date
Version 79.0.3945.130 (Official Build) (64-bit)

以下是一些质疑者的图片:

【问题讨论】:

    标签: typescript


    【解决方案1】:

    我以为 ESNext 应该是针对最新的 javascript 版本,那么为什么这些新功能不可用?

    错误TS1109表示使用的编译器版本不理解TS代码,因为它不是该版本支持的TS语法的一部分。所以它拒绝了 TS 代码为无效并且没有决定应该使用哪个 JS 版本来生成转译代码。

    定位 ESNext

    --module 编译器选项会影响由编译器生成的输出 JS 代码,该编译器对 TS 代码“满意”并决定转译。更准确地说是affects 模块代码生成。

    要获得对无效合并运算符的支持,请安装 TypeScript 版本 3.7.x。然后确保 Visual Studio 或 Visual Studio Code 实际将此版本用于您的项目。例如,如果您使用 VS Code,请按照描述的步骤操作 here.

    附言
    在您提供了看起来不错的class Foo 代码并提到了操场后,我检查了它。正如预期的那样,当编译器设置为 3.6.3 时,它会触发语法错误,并且会发生这种情况:

    第二个问号下面有一点红色的波浪线。

    如果编译器设置为3.7.2,当Config菜单下的Module设置为包括ESNext在内的任何设置时,代码编译运行正常。

    当版本设置为 3.72 并且目标设置为 ESNext 时,在 TypeScript 游乐场中演示了此问题

    无法使用当前最新的 Chrome 79.0.3945.13 重现它。它表明您的浏览器存在游乐场兼容性问题。 Playground 的浏览器兼容性有其局限性。

    附言

    尝试将目标设置而不是模块设置设置为 ESNext

    这不会影响编译器如何处理 TS 代码,因此使用 Target=ESNext 时,无效的合并运算符在版本设置为 3.7.2 时仍被接受,而在版本设置为 3.6.3 时被拒绝。接受后,编译器会愉快地将 TS 转换为 JS 代码,但尝试运行它会触发运行时错误(仅在控制台中可见),因为没有浏览器具有能够运行 ESNext 的 JS 引擎。

    【讨论】:

    • 唉,这不是问题所在。我已经修改了上面的问题,当版本设置为 3.72 并且目标设置为 ESNext 时,该问题在 TypeScript 游乐场中演示。
    • 尝试设置不是模块设置而是目标设置为ESNext。
    • 嗯,我向上帝发誓我不是在编造这个 WinWiz1,请参阅上面的图片。你真的尝试过这个,还是只是断言它?
    • 我在所有情况下都试过了。 Uncaught SyntaxError: Unexpected token '?' 发生在 run-time 与我之前提到的错误完全相同:编译器愉快地转译 TS插入 JS 代码但尝试运行它会触发运行时错误(仅在控制台中可见),因为没有浏览器具有能够运行 ESNext 的 JS 引擎。此错误与 transpile time 您最初提到并描述为第二个问号下方有一点红色波浪的错误。
    • 你说的是“如果编译器设置为 3.7.2.,代码编译和运行没有问题,即使我指出它不适用于目标设置为 ESNext。如果你建议这是没有浏览器能够以 ESNext 为目标运行的预期行为,那么首先在 TypeScript 游乐场(或其他任何地方)上提供该设置有什么意义。整个线程有点像分心,并没有真正回答问题。
    猜你喜欢
    • 2021-10-28
    • 2011-06-22
    • 1970-01-01
    • 2010-09-13
    • 2022-07-26
    • 2021-03-03
    • 1970-01-01
    • 2022-08-09
    • 1970-01-01
    相关资源
    最近更新 更多