TypeScript“ lib”选项的作用是什么?

时间:2018-06-22 11:01:32

标签: typescript lib

我仍然无法为此找到好的答案。 “目标”选项定义了结果将在哪个版本的Javascript上运行。 “ lib”选项在任何地方都不太清楚。似乎这是一种描述目标环境的更精细的方法,但是似乎很奇怪,它影响了您可以在.ts源文件中编写的内容。以为TS是JS的超集,那么为什么它会影响例如Promise()是否可用?看来,它不仅定义了目标,而且还影响了Typescript中可用的功能。有人可以清楚地说明问题还是直接回答问题(在typescriptlang.org或我看过的书中都没有,例如“指定要包含在编译中的库文件”,这绝对没有解释。

2 个答案:

答案 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"]