لماذا لا يمكنني مقارنة `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 لبعض كائنات المتصفح الغريبة، قد تحصل على قيم أخرى، لكن لا يقوم أي محرك جافا سكريبت حديث بهذا.