具有目标ES5的core js和Typescript允许使用不受支持的ES6功能

具有目标ES5的core js和Typescript允许使用不受支持的ES6功能,typescript,definitelytyped,Typescript,Definitelytyped,我有一个TypeScript项目,它是用“target”:“es5”编译的。我使用core-js的集,因此在我的项目中安装了core-js和@types/core-js。 但是,由于核心js d.ts包含Set和Map(以及其他ES6功能)的全局声明,因此TypeScript编译器允许我使用它们,这显然在旧浏览器中不起作用 我不能从构建中排除core.d.ts,因为我显然需要它作为接口 编译器有没有办法阻止我使用ES6功能,而仍然使用core js及其相应的类型定义?因为core js是一个多填

我有一个TypeScript项目,它是用
“target”:“es5”
编译的。我使用core-js的
,因此在我的项目中安装了core-js和@types/core-js。 但是,由于核心js d.ts包含
Set
Map
(以及其他ES6功能)的全局声明,因此TypeScript编译器允许我使用它们,这显然在旧浏览器中不起作用

我不能从构建中排除core.d.ts,因为我显然需要它作为接口


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

因为core js是一个多填充函数,所以它的声明是为了修改全局范围而设计的。我建议您找到或创建自己的set接口声明,它相当简单。 一定要删除@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"
        ]
      }
    }
  }
}

由于core js是一个polyfill,它的声明旨在修改全局范围。我建议您找到或创建自己的set接口声明,它相当简单。 一定要删除@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"
        ]
      }
    }
  }
}

您需要从中获得什么接口?如果不想使用es6功能,则不需要与这些功能对应的类型。我想使用
Set
。但我不想将CoreJS用作全局替换,而是作为一个库。所以我从“core js/library/fn/set”中将*导入为CoreSet在需要它的文件中。所以我可以做
newcoreset()
。但问题是我也可以做
newset()
,它编译得非常完美,然后在浏览器中失败。我明白了。由于core js是一个polyfill,它的声明旨在修改全局范围。我建议您找到或创建自己的set接口声明,它相当简单,并且一定要删除@types/core js包,因为它会对您的名称空间造成严重破坏。您需要从中获得哪些接口?如果不想使用es6功能,则不需要与这些功能对应的类型。我想使用
Set
。但我不想将CoreJS用作全局替换,而是作为一个库。所以我从“core js/library/fn/set”中将*导入为CoreSet在需要它的文件中。所以我可以做
newcoreset()
。但问题是我也可以做
newset()
,它编译得非常完美,然后在浏览器中失败。我明白了。由于core js是一个polyfill,它的声明旨在修改全局范围。我建议您找到或创建自己的set接口声明,它相当简单,并且一定要删除@types/core js包,因为它会破坏您的名称空间谢谢您的详细回答!不过,我在构造方面遇到了麻烦。我定义了
类集合{new():Set;new(值:ArrayLike | Set):Set;…
但是当我尝试调用new Set(someOtherSet)时,我得到一个错误,说“预期的参数为0,但使用1调用”使用constructor关键字声明构造函数,并将type参数放在类本身上,或者使用一对接口的替代方法请参见TypeScript安装目录中的
lib.es2015.d.ts
,其中包含Set和setconstructorhanks的声明,以获取详细答案!我在构造方面遇到了问题我定义了
类集合{new():Set;new(值:ArrayLike | Set):Set;…
但是当我尝试调用新集合(someOtherSet)时,我得到一个错误,说“预期的参数为0,但调用时使用1”使用constructor关键字声明构造函数并将type参数放在类本身上,或者使用一对接口的替代方法请参见TypeScript安装目录中的
lib.es2015.d.ts
,它包含Set和SetConstructor的声明