首页 > 解决方案 > 错误类型错误:构造函数映射需要 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");

标签: javascripttypescript

解决方案


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 环境中运行,您需要包含一个Mappolyfill(因为MapES5 中不存在),它被编写为与 ES5 环境兼容,以便Map可以通过.call上述方式调用。如果你的代码在已经有的现代(ish)环境中运行Map,你仍然需要包含 polyfill,因为它被调用的方式。


推荐阅读