امضاهای ایندکس (Index Signatures)
«امضای ایندکس تایپ اسکریپت» یعنی تعریف نوع برای کلیدهای پویا. بنابراین وقتی نام ویژگی را نمی دانیم، هنوز ایمن می مانیم. مثل کمدهای مدرسه با برچسب های متغیر اما دارای قوانین.
درک سریع امضای ایندکس
«امضای ایندکس (Index Signature)» شکلی از نوع دهی است. با الگو [key: type]: valueType تعریف می شود. سپس با براکت دسترسی می گیریم: obj[key].
امضای ایندکس رشته ای
برای شیئی با کلیدهای رشته ای و مقادیر مشخص، از امضای رشته ای استفاده کن.
interface StringDictionary {
[key: string]: string;
}
const names: StringDictionary = {
firstName: 'Alice',
lastName: 'Smith',
'100': 'One Hundred'
};
console.log(names['firstName']);
console.log(names['lastName']);
console.log(names['100']);
names['age'] = '30';
امضای ایندکس عددی
کلیدها می توانند عددی هم باشند. با این کار مانند آرایه سفارشی رفتار می کند.
interface NumberDictionary {
[index: number]: any;
}
const scores: NumberDictionary = {
0: 'Zero',
1: 100,
2: true
};
console.log(scores[0]);
console.log(scores[1]);
console.log(scores[2]);
scores[3] = { passed: true };
ترکیب ویژگی های مشخص با ایندکس
می توان ویژگی های معلوم را با امضای ایندکس ترکیب کرد. باید سازگار بمانند.
interface UserInfo {
name: string;
age: number;
[key: string]: string | number;
}
const user: UserInfo = {
name: 'Alice',
age: 30,
address: '123 Main St',
zipCode: 12345
};
امضای ایندکس فقط خواندنی
با readonly جلوی تغییر را بگیر. بنابراین داده پایدار می ماند.
interface ReadOnlyStringArray {
readonly [index: number]: string;
}
const names2: ReadOnlyStringArray = ['Alice', 'Bob', 'Charlie'];
console.log(names2[0]);
کاربرد واقعی: پاسخ API
برای دیکشنری منابع در پاسخ API، امضای ایندکس بسیار مناسب است.
interface ApiResponse<T> {
data: {
[resourceType: string]: T[];
};
meta: {
page: number;
total: number;
[key: string]: any;
};
}
interface User {
id: number;
name: string;
email: string;
}
const apiResponse: ApiResponse<User> = {
data: {
users: [
{ id: 1, name: 'Alice', email: 'alice@example.com' },
{ id: 2, name: 'Bob', email: 'bob@example.com' }
]
},
meta: {
page: 1,
total: 2,
timestamp: '2023-01-01T00:00:00Z'
}
};
const users = apiResponse.data.users;
console.log(users[0].name);
نکته های سازگاری نوع
نوع ویژگی های مشخص باید به نوع امضای ایندکس تبدیل پذیر باشد.
interface ConflictingTypes {
[key: string]: number;
name: string;
}
interface FixedTypes {
[key: string]: number | string;
name: string;
age: number;
}
امضای ایندکس یا Record؟
برای نگاشت ساده، Record<K, T> کوتاه تر است. برای ترکیب، امضای ایندکس بهتر است.
interface StringMap {
[key: string]: string;
}
type StringRecord = Record<string, string>;
گام های عملی
- نیاز به کلید پویا را مشخص کن.
- نوع کلید و مقدار را دقیق بنویس.
- ویژگی های ثابت را سازگار نگه دار.
- در صورت عدم تغییر، readonly بگذار.
- برای نگاشت ساده، Record را بررسی کن.
جمع بندی سریع
- امضای ایندکس، کلیدهای پویا را ایمن می کند.
- نوع ویژگی های ثابت باید سازگار باشد.
- readonly جلوی تغییرات ناخواسته را می گیرد.
- برای نگاشت ساده، از Record استفاده کن.
برای مطالعه مرتبط، به فضای نام تایپ اسکریپت و Mapped Types سر بزن. همچنین امضای ایندکس تایپ اسکریپت را به عنوان لنگر داخلی نگه دار.