تعریف صریح و استنتاج نوع (Explicit & Inference)
اینجا فرق «تعریف صریح نوع» و «استنتاج نوع» را می بینیم. نوع (Type) یعنی برچسب ساده برای داده. تعریف صریح یعنی خودت نوع را می گویی. استنتاج (Inference) یعنی تایپ اسکریپت خودش حدس می زند.
حاشیه نویسی نوع و استنتاج
دو راه داری: 1) تعریف صریح برای شفافیت. 2) استنتاج برای کد تمیز. برای ورودی ها و خروجی توابع، صریح بنویس. برای متغیرهای ساده، استنتاج کافی است.
تعریف صریح نوع (Explicit)
در تعریف صریح، دقیقاً نوع را اعلام می کنی. این کار کد را قابل فهم و نگه داری پذیر می کند.
let greeting: string = "Hello, TypeScript!";
let userCount: number = 42;
let isLoading: boolean = true;
let scores: number[] = [100, 95, 98];
برای توابع، نوع ورودی و خروجی را صریح کن.
function greet(name: string): string {
return `Hello, ${name}!`;
}
greet("Alice");
// greet(42); // Error: 'number' به 'string' نمی خورد.
استنتاج نوع (Inference)
وقتی مقدار اولیه معلوم است، TS خودش نوع را حدس می زند. این کار کدنویسی را سریع تر می کند.
let username = "alice";
let score = 100;
let flags = [true, false, true];
function add(a: number, b: number) {
return a + b;
}
نکته: استنتاج وقتی عالی است که همان جا مقداردهی کنی. متغیرِ بی مقدار معمولاً any می شود.
استنتاج آبجکت
TS شکل آبجکت را هم می فهمد. پس اگر ویژگی نباشد، خطا می دهد.
const user = {
name: "Alice",
age: 30,
isAdmin: true
};
console.log(user.name);
// console.log(user.email); // Error: 'email' وجود ندارد.
نمونه های خطای ناسازگاری نوع
TS خطاهای نوعی را زود می گیرد. بنابراین باگ ها کمتر می شوند.
let nickname: string = "alice";
// nickname = 42; // Error: 'number' به 'string' نمی خورد.
let level = 100;
// level = "high"; // Error: 'string' به 'number' نمی خورد.
جاوااسکریپت در برابر تایپ اسکریپت
در JS، این کد اجرا می شود و ممکن است باگ بسازد.
function addJS(a, b) {
return a + b;
}
console.log(addJS("5", 3));
در TS، همان مثال را ایمن کن.
function addTS(a: number, b: number): number {
return a + b;
}
// console.log(addTS("5", 3)); // Error: 'string' مجاز نیست.
وقتی استنتاج کافی نیست
گاهی TS نوع درست را حدس نمی زند و any می شود. any یعنی کنترل نوع خاموش است.
const data = JSON.parse('{ "name": "Alice", "age": 30 }');
let something;
something = "hello";
something = 42;
هشدار: تا می توانی از any دوری کن. نوع نویسی کن، Interface بساز، Type Guard بنویس و noImplicitAny را فعال کن.
برای ادامه مسیر، از انواع ساده مرور کن. سپس به نوع های ویژه برو.
جمع بندی سریع
- ورودی و خروجی توابع را صریح بنویس.
- برای متغیرهای ساده، استنتاج کافی است.
- ناسازگاری نوع، زود کشف می شود.
- از any فقط در ضرورت استفاده کن.
- Object Inference شکل داده را حفظ می کند.