فهرست سرفصل‌های TypeScript
خانه (Home) معرفی (Introduction) شروع سریع (Get Started) انواع ساده (Simple Types) تعریف صریح و استنتاج نوع (Explicit & Inference) انواع ویژه (Special Types) آرایه ها (Arrays) تاپل ها (Tuples) انواع شیء (Object Types) شمارشی ها (Enums) نام مستعار و اینترفیس ها (Aliases & Interfaces) انواع اتحادی (Union Types) توابع (Functions) تبدیل نوع (Casting) کلاس ها (Classes) جنریک های پایه (Basic Generics) انواع کاربردی (Utility Types) کلیدواژه keyof (Keyof) Null (Null) Definitely Typed (Definitely Typed) به روزرسانی های نسخه 5 (5 Updates) پیکربندی (Configuration) با Node.js (with Node.js) با React (with React) ابزارها (Tooling) انواع پیشرفته (Advanced Types) نگهبان های نوع (Type Guards) انواع شرطی (Conditional Types) انواع نگاشتی (Mapped Types) استنتاج نوع (Type Inference) انواع لیترال (Literal Types) فضای نام (Namespaces) امضاهای ایندکس (Index Signatures) ادغام اعلان ها (Declaration Merging) برنامه نویسی ناهمگام (Async Programming) دکوراتورها (Decorators) در پروژه های JS (in JS Projects) مهاجرت (Migration) مدیریت خطا (Error Handling) بهترین شیوه ها (Best Practices) ادیتور (Editor) تمرین ها (Exercises) آزمون (Quiz) سرفصل دوره (Syllabus) برنامه مطالعه (Study Plan) گواهینامه (Certificate)
نتیجه‌ای برای جستجو یافت نشد.
TypeScript

TypeScript — امضاهای ایندکس (Index Signatures)

آخرین بروزرسانی: 1404/08/14

امضاهای ایندکس (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>;

مشاهده در ادیتور

گام های عملی

  1. نیاز به کلید پویا را مشخص کن.
  2. نوع کلید و مقدار را دقیق بنویس.
  3. ویژگی های ثابت را سازگار نگه دار.
  4. در صورت عدم تغییر، readonly بگذار.
  5. برای نگاشت ساده، Record را بررسی کن.

جمع بندی سریع

  • امضای ایندکس، کلیدهای پویا را ایمن می کند.
  • نوع ویژگی های ثابت باید سازگار باشد.
  • readonly جلوی تغییرات ناخواسته را می گیرد.
  • برای نگاشت ساده، از Record استفاده کن.

برای مطالعه مرتبط، به فضای نام تایپ اسکریپت و Mapped Types سر بزن. همچنین امضای ایندکس تایپ اسکریپت را به عنوان لنگر داخلی نگه دار.