我仍然无法为此找到好的答案。 “目标”选项定义了结果将在哪个版本的Javascript上运行。 “ lib”选项在任何地方都不太清楚。似乎这是一种描述目标环境的更精细的方法,但是似乎很奇怪,它影响了您可以在.ts源文件中编写的内容。以为TS是JS的超集,那么为什么它会影响例如Promise()
是否可用?看来,它不仅定义了目标,而且还影响了Typescript中可用的功能。有人可以清楚地说明问题还是直接回答问题(在typescriptlang.org或我看过的书中都没有,例如“指定要包含在编译中的库文件”,这绝对没有解释。
答案 0 :(得分:4)
Typescript没有任何内置类型,所有类型都来自一组基本定义(位于typescript安装目录的lib
文件夹中)。默认情况下,target
定义要包含的libs
。例如docs状态:
注意:如果未指定--lib,则会注入默认的librares列表。注入的默认库为:
►对于
--target ES5: DOM,ES5,ScriptHost
►对于
--target ES6: DOM,ES6,DOM.Iterable,ScriptHost
基本思想是,目标是处理语言功能(更具体地说,哪些语言功能需要向下编译,例如:for-of或箭头功能),而lib
选项则处理语言功能。运行时环境具有(即内置对象是什么样,它们是什么)。
理想情况下,应使用给定libs
的默认target
。但是,我们可能具有一个支持某些运行时设施但不支持语言功能的环境,或者我们可以使用较低的es
版本定位运行时并填充一些运行时设施,通常完成某些事情(例如:Promises)。
答案 1 :(得分:1)
请记住,TS 从不将代码填充插入代码中。是not its goal。补充上面的答案:
target
告诉TS您希望最终代码支持哪个ES规范。如果将其配置为ES5
,TS会将语法功能向下编译为ES5,因此代码中的所有箭头功能(() => {}
)都将转换为功能。但这也将假定您的浏览器在运行时支持所有ES5功能。例如,如果您的代码中包含Array.isArray
(一种ES5功能),而您尝试在IE8中打开网站,则该浏览器将因浏览器不支持此功能而中断。如果要支持该浏览器,则必须对其进行填充。
lib
告诉TS项目中要包括哪些类型定义。如果您有"target": "es5"
,则lib
的默认值为["dom", "es5", "ScriptHost"]
。这意味着浏览器将在运行时支持哪些功能。将内容添加到lib
只是为了让TS开心-您仍然需要自己在项目中导入polyfill。简而言之:首先配置target
,如果您的项目中需要任何额外的polyfill,或者您知道,您的浏览器将支持此额外功能,lib
是如何使TS对此感到满意。
示例: 您不仅需要支持IE11,而且还希望使用Promises。 IE11支持ES5,但是Promises是ES6的功能。您可以告诉Typescript,您的代码将针对ES5 +您要添加的额外的polyfill:
"target": "es5",
"lib": ["es5", "dom", "ScriptHost", "es2015.promise"]