Реагировать на Typescript, вызвать функцию из внешнего скрипта - PullRequest
0 голосов
/ 28 апреля 2019

В своем приложении реагирования я получаю пользовательский файл javascript с сервера и добавляю его как тег script к телу document.

этот новый добавленный файл содержит метод с именем manipulator. Теперь в одном из компонентов я хочу вызвать эту функцию. Как я знаю, функция должна существовать в глобальном объекте window.

if(documnet.getElementById('customJsId')){ // check if the script tag exists in document
 window.manipulator(); // which I get Property 'iframeManipulator' does not exist on type 'Window'.ts(2339)
}

Но тут я получаю ошибку компилятора

Свойство 'манипулятор' не существует для типа 'Window'.ts (2339)

, что вполне логично, но я не нашел способа создать расширенный интерфейс для window или каким-либо другим способом сообщить компилятору, что в window есть дополнительная функция с именем manipulator.

Любая помощь приветствуется.

  ----------Just in case--how the script is added to document--------------
  loadProjectCustomJS() {
    runInAction(async () => {
      thisfetchProjectJs().then((doc) => {
        const body: HTMLBodyElement = document.getElementsByTagName('body')[0];
        const customjs: HTMLScriptElement = document.createElement('script');
        customjs.type = 'text/javascript';
        customjs.id = 'customJsId'
        customjs.src = doc.get('resourceUrl');
        body.appendChild(customjs);
      });
    });
  }

1 Ответ

1 голос
/ 28 апреля 2019

Вы можете добавить его в интерфейс Window из модуля TypeScript (ts или tsx) следующим образом:

declare global {
  interface Window {
    manipulator: () => void;
  }
}

Или вы можете создать глобальный global.d.ts (имя не имеет значения, только то, что он находится внутри вашего исходного каталога), содержащий это:

declare interface Window {
  manipulator: () => void;
}

Имейте в виду, что это делает функцию доступной везде, в том числе и до инициализации скрипта.

...