【问题标题】:Declaring a global array extension leads to compiler error声明全局数组扩展会导致编译器错误
【发布时间】:2019-01-30 20:46:17
【问题描述】:

我想用 TypeScript 编写数组扩展:

if (!Array.prototype.remove) {
    Array.prototype.remove = function <T>(elem: T): T[] {
        return this.filter(e => e !== elem);
    }
}

所以我需要为它声明一个接口。该文件中没有任何内容,只是:

declare global {
    interface Array<T> {
        remove(elem: T): Array<T>;
    }
}

但是编译器会哭:

TS2669:全局范围的扩展只能直接嵌套在外部模块或环境模块声明中

有趣的是,当我之前添加这一行时:

import * as $ from "jquery";

(与Array什么的无关——这里没有使用jQuery),编译器没问题。

知道这里发生了什么吗?以及如何在不添加对jquery的引用的情况下声明接口?

【问题讨论】:

    标签: typescript


    【解决方案1】:

    在 typescript 中,在顶层具有导入/导出的文件被视为模块,而在顶层没有导入/导出的文件被视为脚本 - 这已经在全局范围内。

    所以如果我们想在全局中定义它,我们要么添加一个导入,所以它是一个模块,我们可以将它定义为全局 - 或者我们只是删除“定义全局”,它作为脚本在 gobal 范围内执行。

    所以将其设置为文件中的内容就足够了:

    interface Array<T> {
        remove(elem: T): Array<T>;
    }
    

    【讨论】:

      猜你喜欢
      • 2016-05-13
      • 1970-01-01
      • 1970-01-01
      • 2022-10-20
      • 2016-11-08
      • 2012-11-09
      • 1970-01-01
      • 2016-09-09
      • 1970-01-01
      相关资源
      最近更新 更多