为什么在使用Typescript时需要使用polyfill?

7
假设我想要使用 Object.values()。为了使用它,我必须设置"lib":["es2017"]。但是我有"target":"es6"
作为一名新的Typescript用户,我的理解是我正在使用 es2017 的方法,并输出 es6 代码。
所以我的问题是,为什么我需要一个polyfill(兼容性补丁),如何选择一个可靠的polyfill?

可能是如何在TypeScript中使用Object.values?的重复问题。 - Aaron Beall
1
请参见需要澄清目标和lib编译器选项 - Aaron Beall
1
不是“使用typescript的Object.values”的重复问题,我只是将其作为一个具体的例子。会查看其他建议的重复问题。谢谢! - Luke Pighetti
2个回答

11

Typescript尽可能减少了运行时的影响。除了一些非常有限的实用函数外,它没有其他的运行时行为。这是设计时考虑的。

Typescript无法知道您的代码将在什么环境下运行以及它对哪个功能具有支持级别。当指定lib或target选项时,您告诉Typescript需要运行时支持所需的功能,而不是Typescript如何实现这一点的问题。


1
我理解这一点。但是为什么 lib es2017target es6 不允许我编写 es2017 代码并在 es6 目标上运行呢?据我所知,我仍然需要一个 polyfill。 - Luke Pighetti
3
@LukePighetti 或许这个答案可以更好地解答你的问题 https://dev59.com/I1UK5IYBdhLWcg3w9zyJ#51044240 - Titian Cernicova-Dragomir
@LukePighetti 或者这个 https://dev59.com/31UL5IYBdhLWcg3wB0BJ#50987516 - Titian Cernicova-Dragomir

7

TypeScriptAPI调用语法区分开来。

TypeScript编译器降级语法(可识别特殊字符,如=>?`#以及关键字,如classstatic),但不编译API。要填充API调用,例如Array.prototype.flat(在ES2019中引入),需要另外一个编译器,例如Babel

示例

以下编译器配置将转换空值合并运算符(??)和class本身,但不会编译API调用Array.prototype.flat(尽管它不存在于ES5中):

tsconfig.json

{
  "compilerOptions": {
    "lib": ["ES2019"],
    "target": "ES5"
  }
}

main.ts

export class MyConverter {
  static flatten(numbers?: (number | number[])[]) {
    return (numbers ?? []).flat();
  }
}

main.js

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.MyConverter = void 0;
var MyConverter = /** @class */ (function () {
    function MyConverter() {
    }
    MyConverter.flatten = function (numbers) {
        return (numbers !== null && numbers !== void 0 ? numbers : []).flat();
    };
    return MyConverter;
}());
exports.MyConverter = MyConverter;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接