javascript - 错误类型错误:构造函数映射需要 ES5 中的“新”?
问题描述
代码是:
export class ExtendedMap<T, U> extends Map {
constructor() {
super();
}
toggle(key: T, value: U) {
if (this.has(key)) {
super.delete(key);
} else {
super.set(key, value);
}
}
has(key: T): boolean {
return super.has(key);
}
}
ES5 编译时出现此错误:
错误类型错误:构造函数映射需要“新”
我这样使用它:
public registryLayers = new ExtendedMap<number, any>();
片段(没有注释掉 TypeScript 部分):
/*export*/ class ExtendedMap/*<T, U>*/ extends Map {
constructor() {
super();
}
toggle(key/*: T*/, value/*: U*/) {
if (this.has(key)) {
super.delete(key);
} else {
super.set(key, value);
}
}
has(key/*: T*/)/*: boolean*/ {
return super.has(key);
}
}
/*public*/ registryLayers = new ExtendedMap/*<number, any>*/();
console.log("Worked without error");
解决方案
Map
如果你的目标是 ES5,TypeScript 应该会抱怨(在这个例子中就是这样)。
如果您忽略 TypeScript 中的该错误,然后运行 TypeScript 在现代(ish)JavaScript 引擎中生成的代码,那么问题在于 TypeScript 创建的代码试图Map
像旧式构造函数一样调用。当您将 TypeScript 配置为发出 ES5 代码时,它不会发出class
构造,因为 ES5 没有它们。相反,它发出构造函数语法,并且在您的ExtendedMap
构造函数中,它尝试Map
像这样调用:
return _super.call(this) || this; // Where `_super` is set to `Map`
但是在现代环境中,Map
被定义为class
构造函数并且不能以这种方式调用,从而导致您遇到错误。
如果您需要您的代码在 ES5 环境中运行,您需要包含一个Map
polyfill(因为Map
ES5 中不存在),它被编写为与 ES5 环境兼容,以便Map
可以通过.call
上述方式调用。如果你的代码在已经有的现代(ish)环境中运行Map
,你仍然需要包含 polyfill,因为它被调用的方式。
推荐阅读
- json - 如何选择数据并将其放在来自 Xamarin 中 HTTP 请求的标签文本上
- python - 如何使用 Python3 中的格式正确格式化打印(打印中有许多参数)?
- bash - 按顺序对不同文件夹中的文件进行编号,同时在编号后保留名称
- fullcalendar - FullCalendar - Google 日历 - 凭据无效 (401)
- javascript - 如何将 PHP 函数转换为使用 Ajax 调用
- javascript - 我做了一个侧面下拉菜单。不工作
- elasticsearch - 如何将分析器添加到弹性搜索弹簧数据中的嵌套字段?
- angular - 如何使用 Angular Fire 从我的 Angular 代码中检索插入到 FireStore 集合中的文档的 UID?
- r - 从重复的 ID 中提取多个值
- mysql - 可能 FULLTEXT 索引 MYSQL 视图列