Элемент неявно имеет тип "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];