TypeScript"lib"选项到底有什么作用?

Mor*_*sen 12 typescript lib

我还是找不到合适的答案."target"选项定义了结果将在哪个版本的Javascript上运行."lib"选项在任何地方都不太清楚.似乎它是一种更精细的方式来描述目标环境,但是它似乎很奇怪它会影响你在.ts源文件中写的内容.认为TS是什么作为JS的超集,那么为什么它会影响,例如,Promis()是否可用?这似乎不仅定义了目标,还影响了Typescript中可用的功能.有人可以清楚地或直接解释答案(在typescriptlang.org或我看过的书中都没有,例如,"指定要包含在编辑中的库文件",这绝对没有解释

cle*_*son 33

请记住,TS永远不会在您的代码中注入 polyfill。这不是它的目标。补充上面的答案:

target告诉 TS 您希望最终/转译的代码支持哪种 ES 规范。如果将其配置为ES5,TS 会将语法特征向下编译为 ES5,因此() => {}代码中的任何箭头函数都将转换为function () {}.

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

简而言之:target首先配置,如果您的项目中需要任何额外的 polyfill,或者您知道您的浏览器将支持这个额外的小功能,lib那么如何让 TS 对此感到满意。

示例:您需要支持 IE11,但您还想使用 Promise。IE11 支持 ES5,但 promises 是 ES6 特性。您导入了 promises polyfill,但 TS 仍然给出错误。现在你只需要告诉 TypeScript 你的代码将针对 ES5,并且在代码库中使用 promise 是安全的:

"target": "es5",
"lib": ["dom", "es5", "ScriptHost", "es2015.promise"]
Run Code Online (Sandbox Code Playgroud)

  • 这是迄今为止我读过的关于这个主题的最清晰、最简洁的答案。谢谢! (8认同)

Tit*_*mir 6

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

注意:如果未指定--lib,则会注入默认的librares列表。注入的默认库为:

?对于--target ES5: DOM,ES5,ScriptHost

?对于--target ES6: DOM,ES6,DOM.Iterable,ScriptHost

基本思想是,目标是处理语言功能(更具体地说是需要向下编译哪些语言功能,例如:for-of或箭头功能),而该lib选项处理运行时环境具有的功能(即,构建了什么功能)-in对象看起来像是什么)。

理想情况下libstarget应使用给定的默认值。但是,我们可能有一个环境,它支持某些运行时工具,但不支持语言功能,或者我们可以使用较低es版本的运行时作为目标,并填充一些运行时工具,这通常可以用于某些事情(例如:承诺)。

  • 嗯,`Promise` 是一种类型,所以我说的适用。Typescript 尝试在生成的代码中尽量少出现。你想要 polyfills 你需要自己添加它们 (2认同)