Я устанавливаю глобальные пространства имен для своих объектов, явно устанавливая свойство в window
.
window.MyNamespace = window.MyNamespace || {};
TypeScript подчеркивает MyNamespace
и жалуется, что:
Свойство 'MyNamespace' не существует для значения типа 'window' any "
Я могу заставить код работать, объявив MyNamespace
переменную окружения и отбросив window
явность, но я не хочу этого делать.
declare var MyNamespace: any;
MyNamespace = MyNamespace || {};
Как я могу остаться window
там и сделать TypeScript счастливым?
В качестве примечания я нахожу особенно забавным то, что TypeScript жалуется, так как он говорит мне, что он window
имеет тип, any
который определенно может содержать что угодно.
typescript
joshuapoehls
источник
источник
Ответы:
Только что нашел ответ на этот вопрос в ответе на другой вопрос StackOverflow .
По сути, вам нужно расширить существующий
window
интерфейс, чтобы рассказать о своем новом свойстве.источник
.d.ts
файле. Он не работает при использовании в.ts
файле, который использует импорт и экспорт сам. Смотрите этот ответ .declare global { interface Window { ... } }
работе с машинописью 2.5.2, нет необходимости в.d.ts
файл не как упоминалось вышеerror TS1234: An ambient module declaration is only allowed at the top level in a file.
когда я поместил его в начало файла, он исправил эту ошибку, так что, возможно, вам придется это сделать.Чтобы сохранить динамичность, просто используйте:
источник
as
вместо<>
. Смотрите ответ @ Дэвид-Бойд ниже .this
-return (<any> this)['something in scope']
/* tslint:disable */
КАК ТИПИСКРИПТ ^ 3.4.3 НАСТОЯЩЕГО РЕШЕНИЯ НЕ ДЕЙСТВУЕТ
Или...
Вы можете просто набрать:
и вы не получите ошибку компиляции, и она работает так же, как печатать
window.MyNamespace
источник
window['MyNamespace']()
(просто добавьте скобки)Используете TSX? Ни один из других ответов не работал для меня.
Вот что я сделал:
источник
(<any> window).MyNamespace
самом деле<any>
интерпретируется как JSX, а не как приведение типа.Принятый ответ - это то, что я использовал, но с TypeScript 0.9. * Он больше не работает. Новое определение
Window
интерфейса, похоже, полностью заменяет встроенное определение, а не расширяет его.Я взялся за это вместо этого:
ОБНОВЛЕНИЕ: С TypeScript 0.9.5 принятый ответ снова работает.
источник
export default class MyClass{ foo(){ ... } ... }
interface MyWindow extends Window{ mc: MyClass }
declare var window: MyWindow
window.mc = new MyClass()
После этого вы можете вызвать Foo () , например , из Chrome Dev Tools консоли , какmc.foo()
declare var...
каждый файл, который вам нужен.Window
тот простой факт, что это не ванильное окно. Просто обходить проверку типов или пытаться обмануть TS также не способ сделать это.Глобальные являются «злом» :), я думаю, что лучший способ иметь также переносимость:
Сначала вы экспортируете интерфейс: (например: ./custom.window.ts)
Второй вы импортируете
Третье приведенное глобальное окно var с CustomWindow
Таким образом, у вас также не будет красной линии в другой IDE, если вы используете существующие атрибуты объекта окна, поэтому в конце попробуйте:
Протестировано с Typescript 2.4.x и новее!
источник
Если вам нужно расширить
window
объект пользовательским типом, который требует его использования,import
вы можете использовать следующий метод:window.d.ts
См. «Глобальное увеличение» в разделе «Слияние деклараций» Руководства: https://www.typescriptlang.org/docs/handbook/declaration-merging.html#global-augmentation.
источник
Для тех, кто использует Angular CLI, это просто:
SRC / polyfills.ts
My-таможенно-utils.ts
Если вы используете IntelliJ, вам также необходимо изменить следующие настройки в IDE, прежде чем ваши новые полифиллы будут загружены:
источник
declare global
это хитрость, и этот ответ не совсем специфичен для Angular CLI ...Мне не нужно делать это очень часто, единственный случай, который у меня был, это когда я использовал Redux Devtools с промежуточным ПО.
Я просто сделал:
Или вы могли бы сделать:
let myWindow = window as any;
а потом
myWindow.myProp = 'my value';
источник
Большинство других ответов не идеальны.
Я также сталкиваюсь с подобной проблемой этим утром. Я пробовал так много «решений» на SO, но ни одно из них не выдает абсолютно никакой ошибки типа и не позволяет запускать переходы типа в IDE (webstorm или vscode).
Наконец, отсюда
Я нахожу разумное решение, чтобы прикрепить типизации для глобальной переменной, которая действует как интерфейс / класс и пространство имен как .
Пример ниже:
Теперь вышеприведенный код объединяет типизацию пространства имен
MyNamespace
и интерфейсаMyNamespace
в глобальную переменнуюmyNamespace
(свойство window).источник
После поиска ответов, я думаю, что эта страница может быть полезной. https://www.typescriptlang.org/docs/handbook/declaration-merging.html#global-augmentation Не уверен насчет истории слияния объявлений, но он объясняет, почему может работать следующее.
источник
Вот как это сделать, если вы используете TypeScript Definition Manager !
Создать
typings/custom/window.d.ts
:Установите свой пользовательский набор:
Готово, используй это ! Машинопись больше не будет жаловаться:
источник
typings
устарел с Typescript 2.0 (середина 2016 года) и был заархивирован владельцем.Typscript не выполняет проверку типов в свойствах строки.
В идеале сценарий глобальной переменной следует избегать. Я использую его иногда для отладки объекта в консоли браузера.
источник
Создайте файл с именем,
global.d.ts
например,/src/@types/global.d.ts
затем определите интерфейс, например:ссылка: https://www.typescriptlang.org/docs/handbook/declaration-files/templates/global-d-ts.html
источник
Если вы используете Typescript 3.x, вы можете пропустить
declare global
часть в других ответах и вместо этого просто использовать:Это работало со мной при использовании Typescript 3.3, WebPack и TSLint.
источник
^3.4.3
. Этот ответ сработал для меня stackoverflow.com/a/42841166/1114926Для справки (это правильный ответ):
Внутри
.d.ts
файла определенияЕсли вы работаете в браузере, вы добавляете элементы в контекст окна браузера, открывая интерфейс Window:
Та же идея для NodeJS:
Теперь вы объявляете корневую переменную (которая на самом деле будет жить в окне или глобальной переменной)
Затем в обычном
.ts
файле, но импортированном как побочный эффект, вы фактически реализуете его:И, наконец, используйте его в другом месте кодовой базы:
источник
Создание настраиваемого интерфейса расширяет окно и добавляет ваше настраиваемое свойство как необязательное.
Затем позвольте customWindow, использующему пользовательский интерфейс, но оцененному в исходном окне.
Это работает с typcript@3.1.3.
источник
Для тех, кто хочет установить вычисляемое или динамическое свойство
window
объекта, вы обнаружите, что это невозможно с помощьюdeclare global
метода. Чтобы уточнить для этого случая использованияВы можете попытаться сделать что-то вроде этого
Выше будет ошибка, хотя. Это связано с тем, что в Typescript интерфейсы плохо работают с вычисляемыми свойствами и выдают ошибку вроде
Чтобы обойти эту проблему , вы можете пойти с внушал кастинг
window
на<any>
так что вы можете сделатьисточник
Используя create-Reaction-app v3.3, я обнаружил, что самый простой способ добиться этого - расширить
Window
тип в сгенерированном автоматическиreact-app-env.d.ts
:источник
Сначала вам нужно объявить объект окна в текущей области видимости.
Потому что машинопись хочет знать тип объекта.
Поскольку объект окна определен где-то еще, вы не можете переопределить его.
Но вы можете заявить об этом следующим образом:
Это не переопределит объект окна или не создаст другую переменную с именем
window
.Это означает, что окно определено где-то еще, и вы просто ссылаетесь на него в текущей области видимости.
Затем вы можете обратиться к своему объекту MyNamespace просто: -
Или вы можете установить новое свойство
window
объекта просто:И теперь машинопись не будет жаловаться.
источник
window
определен?Я хотел использовать это в библиотеке Angular (6) сегодня, и мне потребовалось некоторое время, чтобы заставить это работать как ожидалось.
Чтобы моя библиотека использовала объявления, мне пришлось использовать
d.ts
расширение для файла, который объявляет новые свойства глобального объекта.Итак, в конце концов, файл закончился чем-то вроде:
/path-to-angular-workspace/angular-workspace/projects/angular-library/src/globals.d.ts
После создания не забудьте выставить его в своем
public_api.ts
.Это сделало это для меня. Надеюсь это поможет.
источник