تحديد نوع رد الاتصال في 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();
الكود يعمل، لذلك يعرض مربع رسالة كما هو متوقع.
سؤالي هو: هل هناك أي نوع يمكنني تحديده لحقل الصنف الخاص بي myCallback؟ الآن، الحقل العام myCallback من نوع any كما هو موضح أعلاه. كيف يمكنني تعريف توقيع الطريقة للـ callback؟ أم يمكنني فقط تعيين النوع إلى نوع معين من الـ callback؟ أم أنني لا أستطيع فعل أي من هذين؟ هل يجب علي استخدام any (ضمني/صريح)؟
حاولت شيئًا مثل هذا، لكنه لم ينجح (خطأ وقت الترجمة):
public myCallback: ();
// or:
public myCallback: function;
لم أستطع العثور على أي تفسير لذلك على الإنترنت، لذلك آمل أن تتمكن من مساعدتي.
الإجابة رقم 1
لقد وجدت للتو شيئًا في مواصفات لغة TypeScript، إنه سهل إلى حد ما. كنت قريبًا جدًا.
التركيب النحوي هو كالآتي:
public myCallback: (name: type) => returntype;
في مثالي، سيكون
class CallbackTest
{
public myCallback: () => void;
public doWork(): void
{
//doing some work...
this.myCallback(); //calling callback
}
}
كاسم مستعار للنوع:
type MyCallback = (name: type) => returntype;
الإجابة رقم 2
للذهاب خطوة أبعد، يمكنك إعلان مؤشر نوع لتوقيع دالة مثل:
interface myCallbackType { (myArgument: string): void }
واستخدمه هكذا:
public myCallback : myCallbackType;
الإجابة رقم 3
يمكنك إعلان نوع جديد:
declare type MyHandler = (myArgument: string) => void;
var handler: MyHandler;
تحديث.
الكلمة المفتاحية declare ليست ضرورية. يجب استخدامها في ملفات .d.ts أو في حالات مشابهة.
الإجابة رقم 4
إليك مثال - لا يقبل أي معطيات ولا يرجع أي شيء.
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;};
الإجابة رقم 5
إذا كنت تريد دالة عامة، يمكنك استخدام ما يلي. على الرغم من أنه يبدو أنها غير موثقة في أي مكان.
class CallbackTest {
myCallback: Function;
}
