جافاسكريبت - خطأ: لا يمكن استدعاء تعبير نوعه يفتقر إلى توقيع استدعاء
أنا جديد تمامًا على تايبسكريبت، ولدي فصلان. في الفصل الأب لدي:
abstract class Component {
public deps: any = {};
public props: any = {};
public setProp(prop: string): any {
return <T>(val: T): T => {
this.props[prop] = val;
return val;
};
}
}
في فئة الطفل لدي:
class Post extends Component {
public toggleBody: string;
constructor() {
this.toggleBody = this.setProp('showFullBody');
}
public showMore(): boolean {
return this.toggleBody(true);
}
public showLess(): boolean {
return this.toggleBody(false);
}
}
كل من showMore و ShowLess يعطيني الخطأ، "لا يمكن استدعاء تعبير نوعه يفتقر إلى توقيع استدعاء."
لكن الدالة التي تعيدها setProp لها توقيع استدعاء، أعتقد؟ أعتقد أنني أفهم شيئًا مهمًا بشكل خاطئ عن أنواع الدوال، لكن لا أعرف ما هو.
شكراً!
الإجابة رقم 1
الدالة التي تُرجع لها تحتوي على توقيع استدعاء، لكنك أخبرت تايب سكريبت بتجاهل ذلك تمامًا عن طريق إضافة : any في توقيعها.
الإجابة رقم 2
لا يمكن استدعاء تعبير نوعه يفتقر إلى توقيع استدعاء.
في شفرتك:
class Post extends Component {
public toggleBody: string;
constructor() {
this.toggleBody = this.setProp('showFullBody');
}
public showMore(): boolean {
return this.toggleBody(true);
}
public showLess(): boolean {
return this.toggleBody(false);
}
}
لديك public toggleBody: string;. لا يمكنك استدعاء string كدالة. لذلك تظهر الأخطاء في : this.toggleBody(true); و this.toggleBody(false);
الإجابة رقم 3
دعونا نفصل هذا:
الخطأ يقول
لا يمكن استدعاء تعبير نوعه يفتقر إلى توقيع استدعاء.
الكود:
المشكلة في هذا السطر public toggleBody: string; &
علاقته بهذه الخطوط:
...
return this.toggleBody(true);
...
return this.toggleBody(false);
- النتيجة:
أنت تقول أن toggleBody هو string لكنك بعد ذلك تتعامل معه كما لو كان شيئًا له call signature (أي البنية لشيء يمكن استدعاؤه: lambdas، proc، دوال، طرق، إلخ. في JS فقط function). تحتاج إلى تغيير الإقرار ليكون public toggleBody: (arg: boolean) => boolean;.
تفاصيل إضافية:
كلمة "invoke" تعني أنك تقوم باستدعاء أو تطبيق دالة.
عبارة "تعبير" في جافاسكريبت هي أساسًا شيء ينتج قيمة، لذا فإن this.toggleBody() يُعد تعبيرًا.
"type" مُعلَن في هذا السطر public toggleBody: string
«يفتقر إلى توقيع الاستدعاء» هذا لأنك تحاول استدعاء شيء this.toggleBody() الذي ليس لديه توقيع (أي بنية شيء يمكن استدعاؤه: الدوال اللامية، البروسيجر، الدوال، الطرق، إلخ) يمكن استدعاؤه. لقد قلت أن this.toggleBody هو شيء يتصرف مثل النص.
بعبارة أخرى، الخطأ يقول
لا يمكن استدعاء تعبير (this.toggleBody) لأن نوعه (:string) يفتقر إلى توقيع استدعاء (لأنه يمتلك توقيع سلسلة).
