我有一个用"target": "es5"
编译的TypeScript项目。我使用 core-js 的Set
所以我在我的项目中安装了 core-js 和 @types/core-js。但是,由于core-js d.ts包含Set
和Map
(以及其他ES6功能(的全局声明,因此TypeScript编译器允许我使用它们,这显然在旧浏览器中不起作用。
我无法从构建中排除 core.d.ts,因为我显然需要它用于接口。
编译器有没有办法阻止我使用 ES6 功能并仍然使用 core-js 及其相应的类型定义?
由于core-js是一个polyfill,它的声明旨在修改全局范围。我建议您找到或创建自己的集合接口声明,这相当简单。一定要删除@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"
]
}
}
}
}