Definirea tipului de callback în TypeScript
Am următoarea clasă în TypeScript:
class CallbackTest
{
public myCallback;
public doWork(): void
{
//doing some work...
this.myCallback(); //calling callback
}
}
Folosesc clasa astfel:
var test = new CallbackTest();
test.myCallback = () => alert("done");
test.doWork();
Codul funcționează, așa că afișează o fereastră de mesaj așa cum era de așteptat.
Întrebarea mea este: Există vreun tip pe care îl pot furniza pentru câmpul clasei mele myCallback? În acest moment, câmpul public myCallback este de tip any, așa cum este arătat mai sus. Cum pot defini semnătura metodei pentru callback? Sau pot pur și simplu să setez tipul la un fel de tip callback? Sau nu pot face niciuna dintre acestea? Trebuie să folosesc any (implicit/explicit)?
Am încercat ceva de genul acesta, dar nu a funcționat (eroare la compilare):
public myCallback: ();
// or:
public myCallback: function;
Nu am putut găsi nicio explicație pentru asta online, așa că sper că mă poți ajuta.
Răspuns #1
Tocmai am găsit ceva în specificația limbajului TypeScript, este destul de ușor. Am fost destul de aproape.
sintaxa este următoarea:
public myCallback: (name: type) => returntype;
În exemplul meu, ar fi
class CallbackTest
{
public myCallback: () => void;
public doWork(): void
{
//doing some work...
this.myCallback(); //calling callback
}
}
Ca un alias de tip:
type MyCallback = (name: type) => returntype;
Răspunsul #2
Pentru a merge un pas mai departe, ai putea declara un pointer de tip către o semnătură de funcție astfel:
interface myCallbackType { (myArgument: string): void }
și folosește-l astfel:
public myCallback : myCallbackType;
Răspunsul #3
Poți declara un tip nou:
declare type MyHandler = (myArgument: string) => void;
var handler: MyHandler;
Actualizare.
Cuvântul cheie declare nu este necesar. Ar trebui folosit în fișierele .d.ts sau în cazuri similare.
Răspunsul #4
Iată un exemplu - nu primește niciun parametru și nu returnează nimic.
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();
Dacă vrei să accepți un parametru, poți adăuga și asta:
public myCallback: {(msg: string): void;};
Și dacă vrei să returnezi o valoare, poți adăuga și asta:
public myCallback: {(msg: string): number;};
Răspunsul #5
Dacă vrei o funcție generică, poți folosi următoarea. Deși nu pare să fie documentată nicăieri.
class CallbackTest {
myCallback: Function;
}
