abbas80
abbas80
خواندن ۲ دقیقه·۶ ماه پیش

تفاوت Unknown و Any در تایپ اسکریبت

یکی از امکانات جالب Typescript تایپ سیفتی بودنش است٬ یعنی یک متغیر در طول برنامه فقط یک تایپ دارد (مثلا number است) و به تایپ دیگر (مثلا string) تفییر نمی کند و این خودش باعث جلوگیری از بسیاری باگ ها می شود


ولی بعضی وقت ها نمیدونیم تایپ متعیرمون رو چی بزاریم یا اصلا تایپش مشخص نسیت که در این مواقع دست به دامن `any‍‍` می شویم٬ حالا `any‍‍` جیست؟

تایپ any

این تایپ می تونه هرجیزی باشه (number, string, یا object) یا به عبارت دیگر شامل همه تایپ های دیگر است پس متغیر می تواند هر داده ای از هر تایپی داشته باشد

let num1 = 14 console.log(typeof(num1)) // number num1 = '14' // Error
ارور ناسازگاری تایپ
ارور ناسازگاری تایپ


همانطور که می بینید با اجرای کد به ارور بر می خوریم ولی با any این نوع ارور ها وجود ندارد

let num2: any = 24 console.log(typeof(num2)) // number num2 = '24' //! No error


و بدین ترتیب هیچ مشکلی پیش نمی آید :-)

بدون شرح
بدون شرح




حالا unknown چه تایپی هست?!

تایپ unknown

اما درمورد unknown این هم از جهاتی مثل any است

let num2: unknown = 24 console.log(typeof(num2)) // number num2 = '24' //! No error

ولی فرقش از آنجا معلوم می شود که در توابع استفاده شود

function addOne(num: any): number { return num + 1 } console.log(addOne(13)) // 14
console.log(addOne('13')) // '131'

به نتیحه دلخواهمون نریسدیم ;.(

function addOne(num: unknown): number { return num + 1 } console.log(addOne(13)) // Error
console.log(addOne('13')) // Error
علاج کار قبل از وقوع
علاج کار قبل از وقوع

حالا با unknown از این باگ فاحش مطلع شدیم ولی هنوز یک مشکل اساسی است



چگونه از unknown استفاده کنیم؟

برای حل این مشکل یک شرط کوچولو کافی است!

function addOne(num: unknown): number { if (typeof(num) == 'number'){ return num + 1 } // rest of function is optional return 1 } console.log(addOne(13)) // 14
console.log(addOne('13')) // 1
  • این شرط چک می کند که آیا متغیر تایپ مورد نطر رو داره یا نه
  • اگر نه٬ از خط می گذرد (بدون هیچ باگ و ارور)
  • نکته: شما می تونید بعد از شرط هر کدی رو بذازید یا حتی ارور خودتون رو برگردونید


خیلی بهتر شد
خیلی بهتر شد


جمع بندی

خلاصه به نطرم unknown از any بهتر است و کمتر با باگ ها دست و پنجه نرم می کنید ولی تا آنجا ممکن است از این دو اجتناب کنید (بخصوص any) و از تایپ های دیگه استفاده کنید و ...

صبر کنید تا ترفندی یاد بدهم که زندگی شما رو راحت تر می کند



فقط کافیه تو فایل tsconfig.json این دو خط کد رو اضافه کنید

noImplicitAny: true // for no any in project
strict: true // for checking type strictly

تا هرموقع از any استفاده می کنید اجازه نده:


موفق باشید !

تایپ اسکریپت
شاید از این پست‌ها خوشتان بیاید