我试图理解Typescript编译器何时转换代码以使其与我指定的目标ECMAScript版本(ES5或ES3)兼容。
例如,TSC 可以很好地转译 for(intArray 的 var int
),但它不会转译 Number.isInteger()(
根据 w3schools 的说法,这是 ES6 的一个功能)。
IE中不支持< code>Number.isInteger()
我能期望什么被转移,什么不会?我最初预计一切都会被转移,这样我就不必跟踪这样的事情,但事实似乎并非如此。
编译器支持基于您告诉它使用的库的功能。
有两种方法可以通过使用目标
和库编译器选项来控制编译器将使用哪个库
。
正如上面链接中所写的:
如果未指定--lib,则会注入默认库。注入的默认库是:
► 对于--目标ES5:DOM、ES5、ScriptHost
► 对于--目标ES6:DOM、ES6、DOM.Iterable、ScriptHost
所有不同的库都是项目的一部分。
如果您的目标是 es3
或 es5
,那么您不能使用 Number.isInteger(),
因为它(如您所述)是 es6
功能。
如果你有一个 polyfil,那么你仍然可以使用 es5
库来定位 es6
:
--target es5 --lib DOM,ES6,ScriptHost
或者您可以复制lib.es6.d.ts的定义:
interface NumberConstructor {
isInteger(number: number): boolean;
}
无论目标如何,您都可以使用let
、const
、for/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];
}
如果未指定目标。
如您所见,const
和 let
变成了 var
s,for/in
变成了一个常规的 for
。
Number.isInteger()
是不同的东西,它是某些目标中不存在的功能,例如 Promise
和“Symbol”。
编译器不会添加 polyfill,由你来添加它,然后告诉编译器它在那里。
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 部分。如果你没有指定适当的lib
s,TypeScript会抱怨它不知道Number.isInteger()
代表什么。
我不知道TypeScript可移植功能的全面列表,但您可以在这里看到TypeScriptcore-js
polyfill的表格。更多关于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功能是否正确?