استنتاج نوع (Type Inference)
«استنتاج نوع (Type Inference)» یعنی تایپ اسکریپت خودش نوع را حدس بزند. مثل وقتی دبیر از پاسخ تو، نمره مناسب را حدس می زند. بنابراین کد کوتاه تر می شود و همچنان امن می ماند.
مقدمه سریع استنتاج نوع
استنتاج نوع برای متغیرها، خروجی توابع، و عبارت ها انجام می شود. سپس ابزارها بهتر کار می کنند و خطاها زودتر دیده می شوند.
let name = 'Alice';
let age = 30;
let isActive = true;
let numbers = [1, 2, 3];
let mixed = [1, 'two', true];
name.toUpperCase();
age.toFixed(2);
استنتاج نوعِ خروجی تابع
تایپِ بازگشتی تابع از روی returnها حدس زده می شود. بنابراین نوشتن تایپ اختیاری است؛ اما گاهی بهتر است.
function greet(name: string) {
return `Hello, ${name}!`;
}
function add(a: number, b: number) {
return a + b;
}
function getValue(key: string) {
if (key === 'name') {
return 'Alice';
}
else {
return 42;
}
}
let greeting = greet('Bob');
let sum = add(5, 3);
let value = getValue('age');
تایپ زمینه ای (Contextual Typing)
گاهی محیط، نوع را تعیین می کند. مثل وقتی اسم بازی را می بینی و می فهمی ژانرش چیست.
const names = ['Alice', 'Bob', 'Charlie'];
names.forEach((name) => {
console.log(name.toUpperCase());
});
const nameLengths = names.map((name) => {
return name.length;
});
document.addEventListener('click', (event) => {
console.log(event.clientX, event.clientY);
});
استنتاج نوع در آبجکت ها
برای آبجکت های درجا، تایپ همه ویژگی ها حدس زده می شود. سپس دسترسی ها امن تر می شوند.
const user = {
id: 1,
name: 'Alice',
email: 'alice@example.com',
active: true,
details: {
age: 30,
address: {
city: 'New York',
country: 'USA'
}
}
};
console.log(user.name.toUpperCase());
console.log(user.details.age.toFixed(0));
console.log(user.details.address.city.toLowerCase());
الگوهای پیشرفته
تأیید ثابت ها (Const Assertions)
با as const نوع به مقدار دقیق محدود می شود. مثل قفل کردن کارت.
let nameVar = 'Alice';
const nameConst = 'Alice' as const;
const userConst = {
id: 1,
name: 'Alice',
roles: ['admin', 'user'] as const
} as const;
نگهبان نوع و جریان کنترل
با «نگهبان نوع»، تایپ در شاخه ها دقیق تر می شود. سپس خطاها کم می شوند.
function processValue(value: string | number) {
if (typeof value === 'string') {
console.log(value.toUpperCase());
}
else {
console.log(value.toFixed(2));
}
}
interface Circle {
kind: 'circle';
radius: number;
}
interface Square {
kind: 'square';
size: number;
}
type Shape = Circle | Square;
function area(shape: Shape) {
switch (shape.kind) {
case 'circle':
return Math.PI * shape.radius ** 2;
case 'square':
return shape.size ** 2;
}
}
بهترین روش ها
جاهایی بگذارید استنتاج انجام شود؛ اما جاهایی هم صریح بنویسید.
let message = 'Hello';
function formatName(firstName: string, lastName: string) {
return `${firstName} ${lastName}`;
}
function processData(input: string[]): { count: number; items: string[] } {
return {
count: input.length,
items: input.map((item) => item.trim())
};
}
const emptyArray: string[] = [];
const configOptions: Record<string, unknown> = {};
const canvas = document.getElementById('main-canvas') as HTMLCanvasElement;
کی نوع صریح بنویسیم؟
برای API عمومی، ساختارهای پیچیده، مستندسازی، و آرایه های خالی بهتر است نوع را صریح بنویسیم. بنابراین خوانایی بالاتر می رود.
گام های عملی
- اول ساده بنویس و به استنتاج اعتماد کن.
- برای ورودی توابع، نوع صریح بده.
- برای خروجی پیچیده، نوع بازگشتی را بنویس.
- برای آرایه خالی، تایپ را مشخص کن.
- با نگهبان نوع، شاخه ها را دقیق تر کن.
جمع بندی سریع
- استنتاج نوع کد را کوتاه و امن می کند.
- زمینه کد روی نوع اثر دارد.
as constنوع را محدود می کند.- جاهایی نوع صریح بهتر است.
مطالب مرتبط: انواع نگاشتی، انواع شرطی، و نگهبان های نوع. همچنین نمونه کدها در W3Schools: Type Inference بررسی شده اند.