التحقق من النوع - التحقق من نوع الفصل في TypeScript
في ActionScript، من الممكن التحقق من النوع أثناء التشغيل باستخدام عامل is:
var mySprite:Sprite = new Sprite();
trace(mySprite is Sprite); // true
trace(mySprite is DisplayObject);// true
trace(mySprite is IEventDispatcher); // true
هل من الممكن اكتشاف إذا كانت متغير (يمتد أو) هو فئة معينة أو واجهة معينة باستخدام TypeScript؟
لم أتمكن من العثور على أي شيء عنه في مواصفات اللغة. يجب أن يكون هناك عند العمل مع الفئات/الواجهات.
الإجابة رقم 1
4.19.4 عامل instanceof
يتطلب العامل
instanceofأن يكون العامل الأيسر من النوع Any، أو نوع كائن، أو نوع معلمة نوع، وأن يكون العامل الأيمن من النوع Any أو نوع فرعي من نوع واجهة 'Function'. النتيجة دائمًا من النوع البدائي Boolean.
لذلك يمكنك استخدام
mySprite instanceof Sprite;
لاحظ أن هذا العامل موجود أيضًا في ActionScript، لكنه لا ينبغي استخدامه هناك بعد الآن:
عامل is، وهو جديد في ActionScript 3.0، يتيح لك اختبار ما إذا كانت المتغير أو التعبير عضوًا في نوع بيانات معين. في الإصدارات السابقة من ActionScript، كان عامل instanceof يوفر هذه الوظيفة، ولكن في ActionScript 3.0 لا ينبغي استخدام عامل instanceof لاختبار العضوية في نوع البيانات. يجب استخدام عامل is بدلاً من عامل instanceof للتحقق اليدوي من النوع، لأن التعبير x instanceof y يتحقق ببساطة من سلسلة النماذج الأولية لـ x لوجود y (وفي ActionScript 3.0، سلسلة النماذج الأولية لا توفر صورة كاملة لتسلسل الوراثة).
يشارك instanceof في TypeScript نفس المشاكل. وبما أنها لغة لا تزال قيد التطوير، أوصي بأن تقدم اقتراحًا لمثل هذه الميزة.
انظر أيضًا:
- MDN: عامل instanceof
- وثائق TypeScript:
instanceofالتضييق، الذي يوضح كيف يمكن استخدامinstanceofلتضييق الأشياء
الإجابة رقم 2
لـ TypeScript طريقة للتحقق من نوع المتغير أثناء وقت التشغيل. يمكنك إضافة دالة تحقق تُرجع شرط النوع. لذا يمكنك استدعاء هذه الدالة داخل عبارة if، والتأكد من أن كل الشيفرة داخل هذا البلوك آمنة للاستخدام بالنوع الذي تعتقد أنه عليه.
مثال من وثائق TypeScript:
function isFish(pet: Fish | Bird): pet is Fish {
return (<Fish>pet).swim !== undefined;
}
// Both calls to 'swim' and 'fly' are now okay.
if (isFish(pet)) {
pet.swim();
}
else {
pet.fly();
}
شاهد المزيد على: https://www.typescriptlang.org/docs/handbook/advanced-types.html
الإجابة رقم 3
يمكنك استخدام عامل instanceof لهذه الغاية. من MDN:
يقوم عامل التشغيل instanceof باختبار ما إذا كانت خاصية prototype للباني تظهر في أي مكان في سلسلة النموذج الأولي لكائن.
إذا كنت لا تعرف ما هي النماذج الأولية وسلاسل النماذج الأولية، أوصي بشدة بالبحث عنها. أيضًا، هنا مثال بلغة JS (تعمل TS بطريقة مشابهة في هذا الصدد) قد يوضح المفهوم:
class Animal {
name;
constructor(name) {
this.name = name;
}
}
const animal = new Animal('fluffy');
// true because Animal in on the prototype chain of animal
console.log(animal instanceof Animal); // true
// Proof that Animal is on the prototype chain
console.log(Object.getPrototypeOf(animal) === Animal.prototype); // true
// true because Object in on the prototype chain of animal
console.log(animal instanceof Object);
// Proof that Object is on the prototype chain
console.log(Object.getPrototypeOf(Animal.prototype) === Object.prototype); // true
console.log(animal instanceof Function); // false, Function not on prototype chain
سلسلة النموذج الأولي في هذا المثال هي:
الحيوان > Animal.prototype > Object.prototype
الإجابة رقم 4
لديك نوعان من الشيكات
- نوع البيانات لأنواع أساسية و
- operator instanceof لأنواع معقدة
على سبيل المثال، يمكن تنفيذ فحص isString بهذه الطريقة:
function isString(value) {
return typeof value === 'string' || value instanceof String;
}
