Объявление глобального расширения массива приводит к ошибке компилятора

Matthias Burger спросил: 31 июля 2018 в 09:36 в: typescript

Я хочу написать это расширение массива в 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: Augumentations для глобальной области видимости могут быть непосредственно вложены в внешние модули или декларации окружающего модуля

funny, когда я добавляю эту строку до:

import * as $ from "jquery";

(что не имеет ничего общего с массивом или что-то - jQuery здесь не используется), это хорошо для компилятора.

Любая идея, что здесь происходит? И как я могу объявить интерфейс без добавления ссылки на jquery?


1 ответ

Есть решение
Matthias Burger ответил: 31 июля 2018 в 11:31

В машинописном файле файл с импортом / экспортом на верхнем уровне обрабатывается как модуль, а файл без импорта / экспорта на верхнем уровне - как скрипт - и это уже находится в глобальной области видимости.

Так что, если мы хотим определить его как глобальный, мы либо добавляем импорт, так что это модуль, и мы можем определить его как глобальный - или мы просто удаляем "определить глобальный", и он выполняется как скрипт в глобальной области.

Так что достаточно указать это как содержимое в файле:

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