Определение типа обратного вызова 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;


Я не мог найти никакого объяснения этому онлайн, поэтому я надеюсь, что вы можете мне помочь.

623   6  

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

    Ничего не найдено.