当前位置: 首页 > 知识库问答 >
问题:

当目标为ES5/ES3时,Typescript会翻译什么?

益富
2023-03-14

我试图理解Typescript编译器何时转换代码以使其与我指定的目标ECMAScript版本(ES5或ES3)兼容。

例如,TSC 可以很好地转译 for(intArray 的 var int),但它不会转译 Number.isInteger()(根据 w3schools 的说法,这是 ES6 的一个功能)。

IE中不支持< code>Number.isInteger()

我能期望什么被转移,什么不会?我最初预计一切都会被转移,这样我就不必跟踪这样的事情,但事实似乎并非如此。

共有2个答案

韩宏朗
2023-03-14

编译器支持基于您告诉它使用的库的功能。
有两种方法可以通过使用目标和库编译器选项来控制编译器将使用哪个

正如上面链接中所写的:

如果未指定--lib,则会注入默认库。注入的默认库是:
► 对于--目标ES5:DOM、ES5、ScriptHost
► 对于--目标ES6:DOM、ES6、DOM.Iterable、ScriptHost

所有不同的库都是项目的一部分。

如果您的目标是 es3es5,那么您不能使用 Number.isInteger(),因为它(如您所述)是 es6 功能。
如果你有一个 polyfil,那么你仍然可以使用 es5 库来定位 es6

--target es5 --lib DOM,ES6,ScriptHost

或者您可以复制lib.es6.d.ts的定义:

interface NumberConstructor {
    isInteger(number: number): boolean;
}

无论目标如何,您都可以使用letconstfor/of之类的东西的原因是编译器知道如何生成等效的html" target="_blank">代码,即使所选目标不支持该功能。

例如:

const arr = [1, 2, 3];
for (let num of arr) {}

被编译为:

var arr = [1, 2, 3];
for (var _i = 0, arr_1 = arr; _i < arr_1.length; _i++) {
    var num = arr_1[_i];
}

如果未指定目标。
如您所见,constlet 变成了 vars,for/in 变成了一个常规的 for

Number.isInteger() 是不同的东西,它是某些目标中不存在的功能,例如 Promise 和“Symbol”。
编译器不会添加 polyfill,由你来添加它,然后告诉编译器它在那里。

穆俊杰
2023-03-14

TypeScript传输html" target="_blank">文件,但不聚合填充。因此,可以这样想,任何在< code>target中无效的语法都将被转换成有效的语法。例如,当使用< code>class关键字并将目标设置为< code>ES5时,它将传输以下内容:

class Greeter {
}

对此:

var Greeter = /** @class */ (function () {
    function Greeter() {
    }
    return Greeter;
}());

(你可以在这里多玩玩这个。)

另一方面,它没有添加缺失的功能,您必须自己进行多填充。Number.is整数()是有效的ES5语法,它只是不存在于ES5中的功能。您可以通过导入Babel-Poly的(在引擎盖下使用core-js)或使用类似polyfill.io.的服务来自己进行多填充

注意:不要将 lib 选项与 polyfill 混淆。这不会填充要素。它只是告诉 TypeScript 表现得好像这些 ES 版本中的功能存在一样,因此它会适当地进行类型检查。对于支持的浏览器,您仍然需要自己处理 polyfill 部分。如果你没有指定适当的libs,TypeScript会抱怨它不知道Number.isInteger()代表什么。

我不知道TypeScript可移植功能的全面列表,但您可以在这里看到TypeScriptcore-jspolyfill的表格。更多关于polyfills与transplation的阅读请点击此处。

 类似资料:
  • 在index.hpp中,我创建了一个具有多个数据成员的类,如、等。我在类外部定义了一个构造函数。在program.cpp中,我创建了一个名为SAM的对象。当我试图编译它时,它显示错误。什么原因? Program.cpp index.hpp 错误信息

  • 我使用antlr4使用Python3生成python目标。antlr语法库中的g4语法文件。生成的Python3Lexer。py文件包含我需要翻译成python的Java代码。这里是它输出的两个java段,您也可以在python3语法文件中找到它们 和 我把这些翻译成: 和 这是我的python脚本,用于运行antlr输出,其中包含python而不是java片段。使用命令运行 It错误并打印以下跟

  • 使用--stacktrace选项运行以获取堆栈跟踪。使用--info或--debug选项运行以获取更多日志输出。 生成失败 还定义了$home目录中的文件.bash_profile: 尝试:使用--info或--debug选项运行以获取更多日志输出。 生成失败得总时间:17.897秒

  • 编译为裸机目标 在默认情况下,Rust 尝试适配当前的系统环境,编译可执行程序。举个例子,如果你使用 x86_64 平台的 Windows 系统,Rust 将尝试编译一个扩展名为 .exe 的 Windows 可执行程序,并使用 x86_64 指令集。这个环境又被称作为你的宿主系统(Host System)。 为了描述不同的环境,Rust 使用一个称为目标三元组(Target Triple)的字符

  • 您可使用 Google Translate™ 应用程式翻译词组: 按下侧边电源按钮打开应用程式菜单,找到并轻触Translate(翻译)。 您将看到翻译源语言与目标语言这两种语言。您可通过轻触某一语言的名称来更改语言。 轻触“麦克风”图标并说出您想翻译的词组。 译文将显示在屏幕上。

  • 我很难理解目标版本的含义(ES3与ES5)。 在TypeScript中,输出仍然使用Array.prototype.reduce即使我以ES3为目标,它说人们应该将其作为语言规范来阅读,但并没有澄清很多事情。据我所知,设置对输出和警告/错误消息都没有任何影响。 我认为此选项是为了支持Visual Studio功能是否正确?