اذهب إلى المحتوى

السؤال

نشر

السلام عليكم ورحمه الله تعالي وبركاته تقبل الله منا ومنكم صالح الاعمال وكل عام وانتم ب خير يا احباب اود ان اطرح عليكم مسألة حيرتني

let age;
age = 20;
if (age > "30") {
    console.log("Good");
} else {
    console.log(age.repeat(3));
}

في type script في هذا الكود من المفترض ان age من نوع any ولكن يظهر خطأ لأنه يعتبر النوع number ولكن بشكل ضمني لاني عندما امرر الفاره علي let age; اجد ان نوعه لا يزال any كما هو موضح بالصوره

Screenshot2025-03-29093922.png.3af56ea7a9f4742afe4d29a9d1d42868.png

ومن المفترض ان يظهر الخطأ في Execution time وليس في عمليه compiling

فأريد ان اعرف اكثر عن كيفيه تعامل type script مع auto annotation 

وجزاكم الله خيراً

Recommended Posts

  • 0
نشر

وعليكم السلام ورحمة الله وبركاته . كل عام وأنتم بخير وتقبل الله منا ومنكم صالح الأعمال .

أولا لنشرح ماذا تفعل typescript هنا في هذه الحالة .

إن في TypeScript يتم تعيين النوع any للمتغير age عند تعريفه بدون تهيئة في الكود التالي (let age;). ولكن بمجرد إسناد قيمة 20 إليه (age = 20;)، فإن TypeScript يقوم تلقائيا باستنتاج أن نوع age هو number، ولا يعود any. و هذه العملية تعرف بإسم type inference (الاستدلال التلقائي على النوع).

ولهذا تحدث المشكلة حيث يتم التعامل مع age هكذا:

  • في البداية، let age; لا يحتوي على قيمة، لذا يكون نوع age هو any.
  • بعد إسناد 20 إليه (age = 20;)، يستنتج TypeScript أن age هو number، وبالتالي لم يعد any.
  • عند استدعاء age.repeat(3)، يظهر الخطأ لأن repeat غير موجود في number بل هو دالة متاحة فقط ل string وأيضا حين المقارنة لأنه لا يمكن المقارنة ب number مع string.

وإذا كنت في tsconfig.json تجعل قيمة الخاصية strict ب true فإن هذا النوع من الأخطاء يتم اكتشافه أثناء التحقق من الأنواع في وقت ال compilation وليس في وقت التشغيل. لهذا يمكنك جعلها ب false إذا لم ترد التحقق من الخطأ أثناء ال compilation.

وإذا  كنت تريد منع TypeScript من استنتاج النوع تلقائيا، يمكنك التصريح بأن age من النوع any:

let age: any;

وهذا سيحل المشكلة ولن يتم التعرف على أن age من نوع number لأنه لن يتم التعرف على النوع تلقائيا بما أننا عرفنا نوعه مقدما.

ومن المفترض عند الوقوف على المتغير بعد إسناد قيمة 20 له أن يظهر بنوع number في ال IDE لديك :

image.png.9989f61b9002bac586a1ce5170db8005.png

image.png.4a409934f8af061d46a28059d9c8660f.png

من الممكن أنه يوجد مشكلة لديك في vs code أو مشكلة في إصدار typescript المستعمل لديك أو يوجد مشكلة في ملف tsconfig.json حيث وضعت إعدادات تغير من تعامل vs code معه .

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...