Определение типа обратного вызова TypeScript
у меня есть следующий класс в TypeScript:
class CallbackTest
{
public myCallback;
public doWork(): void
{
//doing some work...
this.myCallback(); //calling callback
}
}
Я использую класс следующим образом:
var test = new CallbackTest();
test.myCallback = () => alert("done");
test.doWork();
код работает, поэтому он отображает messagebox, как и ожидалось.
мой вопрос: есть ли какой-либо тип, который я могу предоставить для моего поля класса myCallback? Прямо сейчас, публичное поле myCallback типа any как показано выше. Как я могу определить сигнатуру метода обратного вызова? Или я могу просто установить тип для какого-то типа обратного вызова? Или я могу сделать пустоту из этих? Я должен использовать any (явное/неявное)?
Я пробовал что-то вроде этого, но это не сработало (Ошибка времени компиляции):
public myCallback: ();
// or:
public myCallback: function;
Я не мог найти никакого объяснения этому онлайн, поэтому я надеюсь, что вы можете мне помочь.
6 ответов:
Я только что нашел что-то в спецификации языка TypeScript, это довольно легко. Я был довольно близко.
синтаксис следующий:
public myCallback: (name: type) => returntype;в моем примере это будет
class CallbackTest { public myCallback: () => void; public doWork(): void { //doing some work... this.myCallback(); //calling callback } }
чтобы сделать еще один шаг, вы можете объявить указатель типа на сигнатуру функции, например:
interface myCallbackType { (myArgument: string): void }и использовать его как это:
public myCallback : myCallbackType;
вы можете объявить новый тип:
declare type MyHandler = (myArgument: string) => void; var handler: MyHandler;обновление.
The
declareключевое слово не надо. Он должен быть использован в.D. TS файлы или в аналогичных случаях.
вот пример-не принимая никаких параметров и ничего не возвращая.
class CallbackTest { public myCallback: {(): void;}; public doWork(): void { //doing some work... this.myCallback(); //calling callback } } var test = new CallbackTest(); test.myCallback = () => alert("done"); test.doWork();Если вы хотите принять параметр, вы можете добавить, что тоже:
public myCallback: {(msg: string): void;};и если вы хотите вернуть значение, можно добавить также:
public myCallback: {(msg: string): number;};
Если вы хотите универсальную функцию, вы можете использовать следующее. Хотя это, кажется, нигде не задокументировано.
class CallbackTest { myCallback: Function; }
я столкнулся с той же ошибкой при попытке добавить обратный вызов к прослушивателю событий. Как ни странно, установка типа обратного вызова в EventListener решила его. Это выглядит более элегантно, чем определение целой сигнатуры функции как типа, но я не уверен, что это правильный способ сделать это.
class driving { // the answer from this post - this works // private callback: () => void; // this also works! private callback:EventListener; constructor(){ this.callback = () => this.startJump(); window.addEventListener("keydown", this.callback); } startJump():void { console.log("jump!"); window.removeEventListener("keydown", this.callback); } }
Comments