دع TypeScript يستنتج الأنواع بالاستنتاج، وافهم لماذا يتفوّق unknown على any الخطير.
افتح هذا الدرس في Kodokonخبر سار: لست مضطرًا لوضع تعليق لكل متغيّر. بفضل استنتاج الأنواع (type inference)، يستنتج TypeScript نوع المتغيّر من القيمة التي تعطيها له. كتابة let city = "Lyon" تكفي: يعلم TypeScript أن city من النوع string ويحميه كما لو أنك وضعت له تعليقًا.
let city = "Lyon"; // inferred type: string
let count = 3; // inferred type: number
count = count + 1; // accepted
// city = 42; -> error: city is still a stringالنوع any يعني "أي شيء". المتغيّر من نوع any يفلت من كل عمليات التحقق: يقبل TypeScript كل شيء، دون تدقيق. الأمر أشبه بخلع حزام الأمان: تُصرَّف الشيفرة، لكن الأخطاء تعود أثناء التشغيل - وهو بالضبط ما كان من المفترض أن يمنعه TypeScript.
let data: any = "hello";
data = 42; // accepted without complaint
// Compiles, but crashes at runtime:
// data.toUpperCase() does not exist on a number!بالنسبة لقيمة نوعها مجهول فعلًا (استجابة خادم، إدخال مستخدم)، فضّل unknown. مثل any، يقبل أي قيمة، لكنه يجبرك على التحقق من النوع (مثلًا بـ typeof) قبل استخدامه. وبذلك يبقى الأمان سليمًا.
let value: unknown = "hello";
// console.log(value.toUpperCase()); -> rejected!
if (typeof value === "string") {
console.log(value.toUpperCase()); // "HELLO"
}