【问题标题】:What does the TypeScript "lib" option really do?TypeScript “lib” 选项的真正作用是什么?
【发布时间】:2018-12-01 20:18:47
【问题描述】:

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

【问题讨论】:

    标签: typescript lib


    【解决方案1】:

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

    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 的特性。你导入了一个 promise polyfill,但 TS 仍然报错。现在你只需要告诉 TypeScript 你的代码将针对 ES5 并且在代码库中使用 Promise 是安全的:

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

    【讨论】:

    • 这是迄今为止我读过的关于这个主题的最清晰、最简洁的答案。谢谢!
    【解决方案2】:

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

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

    ► 发给--target ES5: DOM,ES5,ScriptHost

    ► 发给--target ES6: DOM,ES6,DOM.Iterable,ScriptHost

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

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

    【讨论】:

    • 但是库也会影响 Typescript 端可用的功能? (像 Promise())为什么 TS 不总是只使用多边形?那是声明目标环境中可用的非 TS 设施吗?
    • 好吧,Promise 是一种类型,所以我所说的适用。 Typescript 试图在生成的代码中保持最小的存在。你想要 polyfill,你需要自己添加这些
    • 谢谢。无法在 typescriptlang.org 上的任何地方找到它的真正解释
    • +1 用于默认值列表。遗憾的是,仅指定一个库,例如 es2021,会取消包含其他所有内容。纠正了一个错误,创建了 480 个新错误。这份清单省去了很多麻烦。
    猜你喜欢
    • 2017-01-11
    • 2018-11-21
    • 1970-01-01
    • 2013-02-23
    • 2010-09-11
    • 2017-10-02
    • 2014-04-26
    • 2015-10-14
    • 1970-01-01
    相关资源
    最近更新 更多