Как сообщить TypeScript о функции, присоединенной к глобальному пространству имен

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

Предположим, у меня есть функция, прикрепленная к global, например, getThisOrThat() — это событие. Эта функция присоединена к global, но также является частью модуля, который находится в node_modules проекта. У него идеальные типы для работы, но поскольку модуль не экспортирует функции напрямую (помните, что они привязаны к глобальным).

Так что теперь я не могу сделать import { getThisOrThat } from 'the-module';, потому что транспилируется:

module.getThisOrThat() /// crash and burn cause it's on global :)

Я тоже не могу require() модуль, потому что он, конечно, то же самое, когда транспилируется.

Для прохождения компилятора я на данный момент знаю два варианта.

  • declare var getThisOrThat: Function;
  • global.getThisOrThat()

Оба они работают, чтобы пройти проверку компилятора, но я действительно хочу дать всему проекту преимущество типизации для этого модуля с глобальными функциями. Я также пытался добавить его с помощью <ref />, но не повезло.


person Brad Martin    schedule 28.10.2016    source источник
comment
Вы пытались создать файл d.ts, содержащий ваши глобальные переменные?   -  person Dan Def    schedule 28.10.2016
comment
Я нет, потому что я не уверен, как это будет выглядеть. У меня есть d.ts для глобальных функций, но я не могу импортировать его, потому что он транспилирует вызов module.function. так как же будет выглядеть d.ts и как его потребовать/импортировать?   -  person Brad Martin    schedule 28.10.2016


Ответы (1)


Итак, у вас есть типизация, которая объявляет какую-то функцию в модуле, но во время выполнения вы хотите использовать ее так, как если бы она была глобальной? Затем вы можете добавить свой собственный файл d.ts, который расширяет глобальное пространство имен:

declare module 'the-module-global' {

import * as TheModule from 'the-module';// this import is used for typechecking only

global {
    var getThisOrThat : typeof TheModule.getThisOrThat;
}

}
person artem    schedule 28.10.2016
comment
Ваша формулировка именно то, что мне нужно. Позвольте мне попробовать. Спасибо! - person Brad Martin; 28.10.2016