Búsqueda de sitios web

Definiendo el tipo de callback de TypeScript


Tengo la siguiente clase en TypeScript:

class CallbackTest
{
    public myCallback;

    public doWork(): void
    {
        //doing some work...
        this.myCallback(); //calling callback
    }
}

Estoy usando la clase de esta manera:

var test = new CallbackTest();
test.myCallback = () => alert("done");
test.doWork();

El código funciona, así que muestra un cuadro de mensaje como se esperaba.

Mi pregunta es: ¿Existe algún tipo que pueda proporcionar para mi campo de clase myCallback? Ahora mismo, el campo público myCallback es de tipo any como se muestra arriba. ¿Cómo puedo definir la firma del método del callback? ¿O puedo simplemente establecer el tipo a algún tipo de callback? ¿O no puedo hacer ninguna de estas dos cosas? ¿Tengo que usar any (implícito/explicito)?

Intenté algo así, pero no funcionó (error en tiempo de compilación):

public myCallback: ();
// or:
public myCallback: function;

No pude encontrar ninguna explicación sobre esto en línea, así que espero que puedas ayudarme.

Respuesta #1

Acabo de encontrar algo en la especificación del lenguaje TypeScript, es bastante fácil. Estaba bastante cerca.

la sintaxis es la siguiente:

public myCallback: (name: type) => returntype;

En mi ejemplo, sería

class CallbackTest
{
    public myCallback: () => void;

    public doWork(): void
    {
        //doing some work...
        this.myCallback(); //calling callback
    }
}

Como un alias de tipo:

type MyCallback = (name: type) => returntype;

Respuesta #2

Para ir un paso más allá, podrías declarar un puntero de tipo a una firma de función como:

interface myCallbackType { (myArgument: string): void }

y úsalo así:

public myCallback : myCallbackType;

Respuesta #3

Puedes declarar un nuevo tipo:

declare type MyHandler = (myArgument: string) => void;

var handler: MyHandler;

Actualizar.

La palabra clave declare no es necesaria. Debe usarse en los archivos .d.ts o en casos similares.

Respuesta #4

Aquí hay un ejemplo: no acepta parámetros y no devuelve nada.

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();

Si quieres aceptar un parámetro, también puedes agregar eso:

public myCallback: {(msg: string): void;};

Y si quieres devolver un valor, también puedes agregar eso:

public myCallback: {(msg: string): number;};

Respuesta #5

Si quieres una función genérica, puedes usar la siguiente. Aunque no parece estar documentada en ningún lugar.

class CallbackTest {
  myCallback: Function;
}   

Artículos relacionados