لماذا لا يمكنني مقارنة `typeof x` بـ "null" أو "MyClass" في TypeScript؟
لقد كتبت بعض الشيفرة لإجراء بعض اختبارات النوع أثناء وقت التشغيل:
var x = window.opener;
if (typeof x === 'null') {
// Do something
}
var y = getSomething();
if (typeof y === 'MyClass') {
// ...
} else if (typeof y === 'array') {
// ...
}
لقد حصلت على هذا الخطأ في جميع تعبيرات if:
خطأ TS2365: لا يمكن تطبيق العامل '===' على الأنواع '"string" | "number" | "boolean" | "symbol" | "undefined" | "object" | "function"' و '"null"'.
هل هذه مشكلة في TypeScript؟ لماذا لا يسمح لي باستخدام typeof كما أريد؟
الإجابة رقم 1
هذا ليس ما يفعله typeof!
عامل typeof يأخذ تعبيرًا ويعيد واحدة من القيم التالية*:
"string""number""boolean""symbol""undefined""object""function"
لن ترى typeof ينتج قيماً مثل "null"، "Array"، أو اسم فصل معرف من قبل المستخدم. لاحظ أن typeof null هو "object" لأسباب محزنة.
آه! ماذا أفعل بدلاً من ذلك؟
إذن كنت تظن أن typeof كان أروع مما هو عليه. حسناً!
- لاختبار
null، استخدمexpr === null. يمكنك استخدام الأسلوب الشائعexpr == nullلاختبارundefinedوnullإذا سمح لك زملاؤك باستخدام== - لاختبار وجود مصفوفة، استخدم
Array.isArray(expr). لاحظ أن بعض الأشياء التي تتوقع أن تكون مصفوفات، مثلdocument.getElementsByTagName("div")، ليست كذلك (getElementsByTagNameتعيدNodeList)، لذا كن حذراً - لاختبار نوع الفئة استخدم
expr instanceof ClassName
لدي 99 مشكلة وIE8 واحدة منها
إذا كنت متأكدًا حقًا من أن لديك تركيبة من الكائن ووقت التشغيل تنتج قيمة مختلفة (كما في، أنك اختبرتها فعليًا، وأنتجت بالفعل سلسلة أخرى)، استخدم إعلان نوع على أي جانب من جوانب الاختبار:
if (typeof x === <string>"magicthinger") {
* في المتصفحات القديمة (IE8) عند الاستعلام عن typeof لبعض كائنات المتصفح الغريبة، قد تحصل على قيم أخرى، لكن لا يقوم أي محرك جافا سكريبت حديث بهذا.
