typescript - core-js 和 Typescript 与目标 ES5 允许使用不支持的 ES6 功能

标签 typescript definitelytyped

我有一个使用 "target": "es5" 编译的 TypeScript 项目。我使用 core-js 的 Set 所以我在我的项目中安装了 core-js 和 @types/core-js 。 然而,由于 core-js d.ts 包含 SetMap (以及其他 ES6 功能)的全局声明,TypeScript 编译器允许我使用它们,这显然赢得了无法在旧浏览器中工作。

我无法从构建中排除 core.d.ts,因为我显然需要它来实现接口(interface)。

编译器是否有办法阻止我使用 ES6 功能,而仍然使用 core-js 及其相应的类型定义?

最佳答案

由于 core-js 是一个 polyfill,其声明旨在修改全局范围。我建议您找到或创建自己的集合接口(interface)声明,这相当简单。 一定要删除 @types/core-js 包。

您可以使用的声明如下所示

declare module "core-js/library/fn/set" {
  class Set { ... }
  export = Set;
}

请注意,这是一个环境外部模块声明,其名称与加载程序或节点的 require 函数解析的实际 JavaScript 文件的导入路径相匹配。

应尽可能避免环境外部模块声明,因为它们都有助于环境外部模块的全局命名空间,但在这种情况下很难避免。

避免这种情况的一种方法是使用 tsconfig.json 中的路径配置。

非环境声明.ts 的路径

class Set { ... }
export = Set;

tsconfig.json

{
  "compilerOptions": {
     "baseUrl": "",
     "paths": {
       "core-js/library/fn/set": [
         "path-to-non-ambient-declaration"
        ]
      }
    }
  }
}

关于typescript - core-js 和 Typescript 与目标 ES5 允许使用不支持的 ES6 功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42051264/

相关文章:

cordova - 保存时的 Typescript 编译无法在 cordova .jsproject 中工作 - 2015

Angular 和 typescript : Can't find names - Error: cannot find name

javascript - 如何使用 moment 将时间转换为百分比

typescript - 类型上不存在 Jest typescript 属性模拟

Angularjs - Resharper intellisense 打破了 TypeScript?

typescript - 角 cookies DefinitelyTyped

javascript - Q "noConflict()"的 TypeScript 定义 (d.ts)

css - Ionic 4平滑滚动到 anchor

node.js - 在 TypeScript 中,如何将 Promises 与 Node.js 上的 RSVP 实现结合使用

typescript - 对于已发布的包,@types 应该是什么依赖类型?