Элемент неявно имеет тип "any", потому что тип "Window" не имеет индексной подписи?

Я пытаюсь создать класс Factory в TypScript, но столкнулся с следующей ошибкой:

src/ts/classes/Factory.ts(8,10): ошибка TS7017: элемент неявно имеет тип "any", потому что тип "Window" не имеет индексной сигнатуры.

Я попытался найти эту ошибку, но не увидел ничего, что вполне соответствовало бы тому, что я хочу делать.

Следующий мой класс Factory.

/**
 * @class Factory
 *
 * @description Returns object based on given class string
 */
class Factory {
    public class(className: string): any {
        return window[className];
    }
}

Я бы предпочел не просто подавлять неявные ошибки в компиляторе.

Любые предложения или помощь будут высоко оценены! Если это не лучший способ сделать это, я определенно открыт для его изменения.

Ответ 1

Глобальная переменная window имеет type Window. type Window не имеет подписи индекса, следовательно, typcript не может определить тип window[yourIndex].

Чтобы ваш код прошел, вы можете добавить этот интерфейс в немодульный файл:

interface Window {
    [key:string]: any; // Add index signature
}

Обратите внимание, что это позволит любой доступ к свойству window, например, window.getElmentById("foo") перестанет быть ошибкой из-за опечатки.

Замечание: Опираясь на измененные пользователем глобальные переменные, в долгосрочной перспективе возникают проблемы, вы также не хотите печатать подсказки только для any. Весь смысл машинописи в том, чтобы ссылаться на конкретные типы. any в лучшем случае никогда не должен использоваться. Вы не должны связываться с глобальным пространством имен, и я также не советую полагаться на глобальную переменную окна.

Ответ 2

Другой способ индексирования в окне, без необходимости добавлять объявление, заключается в том, чтобы наложить его на any:

return (window as any)[className];

Ответ 3

может быть попробовать

возвращаемое окно [className as keyof WindowType];