TypeScript "lib" 选项的真正作用是什么?

What does the TypeScript "lib" option really do?

我还没有找到好的答案。 "target" 选项定义 Javascript 结果将 运行 的哪个版本。 "lib" 选项在任何地方的描述都不太清楚。似乎这是描述目标环境的一种更精细的方式,但它会影响您可以在 .ts 源文件中写入的内容,这似乎很奇怪。想到 TS 什么是 JS 的超集,那么为什么它会影响 Promise() 是否可用?这似乎不仅定义了目标,而且还影响了您在 Typescript 中可用的功能。有人可以清楚地解释或直接给出答案吗(在 typescriptlang.org 或我看过的书中有 none,例如 "Specify library files to be included in the compilation",这完全没有解释。

Typescript 没有任何内置类型,所有类型都来自一组基本定义(位于 typescript 安装目录的 lib 文件夹中)。默认情况下,target 定义包含哪些 libs。例如 docs 状态:

Note: If --lib is not specified a default list of librares are injected. The default libraries injected are:

► For --target ES5: DOM,ES5,ScriptHost

► For --target ES6: DOM,ES6,DOM.Iterable,ScriptHost

基本思想是,虽然 target 处理语言特性(更具体地说,哪些语言特性需要向下编译,例如:for-of 或箭头函数),lib 选项处理什么运行时环境具有的设施(即内置对象是什么样的,它们是什么)。

理想情况下,应使用给定 target 的默认值 libs。然而,我们可能有一个支持某些运行时设施但不支持语言功能的环境,或者我们可能以较低的 es 版本为目标运行时并填充一些运行时设施,这通常可以是完成某些事情(例如:Promises)。

请记住,TS 从不 在您的代码中注入 polyfill。是 not its goal。补充接受的答案:

target 告诉 TS 你希望 final/transpiled 代码支持哪个 ES 规范。如果你配置为 ES5,TS 会将 syntactic 特性向下编译为 ES5,因此你代码中的任何箭头函数 () => {} 将被转换为 function () {}.

无论您为 target 选择什么都会影响 lib 的默认值,这反过来会告诉 TS 在您的项目中包含哪些 类型定义 。如果您有 "target": "es5"lib 的默认值将为 ["dom", "es5", "ScriptHost"]。它假设浏览器将在运行时支持哪些 functional 功能。添加东西到 lib 只是为了让 TS 高兴 - 你仍然需要在项目中自己导入 polyfill。

简而言之:首先配置 target,如果您的项目需要任何额外的 polyfill 或者您 知道 您的浏览器将支持这个额外的东西特点,lib就是让TS开心的方法

示例: 你需要支持 IE11,但你也想使用 promises。 IE11 支持 ES5,但 promises 是 ES6 的特性。你导入了一个 promises polyfill,但是 TS 仍然报错。现在你只需要告诉 TypeScript 你的代码将以 ES5 为目标并且在代码库中使用 promises 是安全的:

"target": "es5",
"lib": ["dom", "es5", "ScriptHost", "es2015.promise"]