javascript вызов - Как я могу объявить функцию из другого файла в TypScript?




функции внешнего (4)

У меня есть следующая функция в файле:

function alertWin(title, message) {
   .......
   .......
}

В другом файле машинописных файлов у меня есть:

function mvcOnFailure(message) {
    "use strict";
    alertWin("Internal Application Error", message);
}

Я получаю сообщение об ошибке «alertwin» не существует в текущей области.

Является ли способ решить это для меня, чтобы определить эту функцию в другом файле, а затем ссылаться на это? Если да, то каково будет определение?


Answers

Вам просто нужно сообщить инструментам и компилятору, где найти свою функцию, добавив ссылку на верхнюю часть вашего файла:

/// <reference path="fileWithFunction.ts" />

Кроме того, все ваши параметры в настоящее время напечатаны как any , вы можете ввести их явно, если хотите.

function alertWin(title: string, message: string) : void {
   //.......
   //.......
}

Этот подход, похоже, работает на меня:

declare function alertWin(title: string, message: string) : void;

И как с решением Мэтта вы помещаете его в файл определения, а затем ссылаетесь на него.


Вы можете сделать это (предполагая, что название и сообщение должны быть строками):

interface alertWinInterface{
    (title:string, message: string):any;
}

declare var alertWin: alertWinInterface;

Вы можете поместить это в тот же файл или поместить в отдельный файл определений окружающей среды (.d.ts), который вы импортируете:

/// <reference path="myDefinitions.d.ts" />

Или вы можете просто импортировать другой файл, который имеет фактическое определение функции, но вы не получите статическую поддержку ввода.


Это очень распространенная проблема, с которой мы сталкиваемся, борясь с «тайн» JavaScript. Позвольте мне попробовать демистифицировать эту тайну сегодня.

Начнем с простой функции JavaScript:

function foo(){
// do something 
 return 'wohoo';
}

let bar = foo(); // bar is 'wohoo' here

Это простой синхронный вызов функции (где каждая строка кода «завершена с заданием» до следующего в последовательности), и результат будет таким же, как и ожидалось.

Теперь добавим немного поворота, введя небольшую задержку в нашей функции, чтобы все строки кода не были «закончены» последовательно. Таким образом, он будет эмулировать асинхронное поведение функции:

function foo(){
 setTimeout( ()=>{
   return 'wohoo';
  }, 1000 )
}

let bar = foo() // bar is undefined here

Итак, вы идете, эта задержка просто сломала функциональность, которую мы ожидали! Но что именно произошло? Ну, на самом деле это довольно логично, если вы посмотрите на код. функция foo()после выполнения ничего не возвращает (возвращается возвращаемое значение undefined), но она запускает таймер, который выполняет функцию после 1s, чтобы вернуть «wohoo». Но, как вы можете видеть, значение, присвоенное бару, является немедленно возвращенным материалом из foo (), а не чем-либо еще, что приходит позже.

Итак, как мы решаем эту проблему?

Давайте попробуем нашу функцию для ОБЕЩАНИЯ . Обещание действительно о том, что это означает: это означает, что функция гарантирует, что вы предоставите любой результат, который он получит в будущем. поэтому давайте посмотрим на это в нашей маленькой проблеме выше:

function foo(){
   return new Promise( (resolve, reject) => { // I want foo() to PROMISE me something
    setTimeout ( function(){ 
      // promise is RESOLVED , when execution reaches this line of code
       resolve('wohoo')// After 1 second, RESOLVE the promise with value 'wohoo'
    }, 1000 )
  })
}

let bar ; 
foo().then( res => {
 bar = res;
 console.log(bar) // will print 'wohoo'
});

Таким образом, резюме - для решения асинхронных функций, таких как вызовы на основе ajax и т. Д., Вы можете использовать обещание для resolveзначения (которое вы собираетесь вернуть). Таким образом, короче говоря, вы разрешаете значение вместо возврата в асинхронных функциях.

ОБНОВЛЕНИЕ (Обещает с асинхронным / ожиданием)

Помимо использования then/catchдля работы с обещаниями существует еще один подход. Идея состоит в том, чтобы распознать асинхронную функцию, а затем ждать выполнения обещаний , прежде чем перейти к следующей строке кода. Это все еще только promisesпод капотом, но с другим синтаксическим подходом. Чтобы сделать все более ясным, вы можете найти сравнение ниже:

затем / catch версия:

function fetchUsers(){
   let users = [];
   getUsers()
   .then(_users => users = _users)
   .catch(err =>{
      throw err
   })
   return users;
 }

Версия async / await:

  async function fetchUsers(){
     try{
        let users = await getUsers()
        return users;
     }
     catch(err){
        throw err;
     }
  }




javascript typescript