interface در مقابل type (Type Alias)
interface عمدتاً برای توصیف شکل یک شیء یا کلاس بهکار میرود و قابلیت خاصی به نام Declaration Merging دارد (چند interface همنام با هم ادغام میشوند)، در حالی که type انعطاف بیشتری دارد و میتواند اتحاد (Union)، تقاطع (Intersection) یا نوعهای اولیه و Tuple را هم تعریف کند، اما Declaration Merging ندارد.
| ویژگی | interface | type (Type Alias) |
|---|---|---|
| Declaration Merging | دارد | ندارد |
| پشتیبانی از Union/Tuple | ندارد | دارد |
| مناسب برای | شکل شیء/کلاس | انواع پیچیده و ترکیبی |
کِی از interface استفاده کنیم؟
وقتی شکل یک شیء یا قرارداد یک کلاس را تعریف میکنید و ممکن است بعداً بخواهید آن را Extend یا در جاهای مختلف گسترش دهید.
کِی از type (Type Alias) استفاده کنیم؟
وقتی نیاز به تعریف Union Type، Intersection یا نوعهای پیچیدهتر غیر از شکل ساده شیء دارید.
مثال interface
interface User {
id: number;
name: string;
}
interface User { // با تعریف بالا ادغام میشود
email: string;
}
مثال type (Type Alias)
type Status = "pending" | "active" | "closed"; // Union
type Point = [number, number]; // Tuple
type ReadonlyUser = Readonly<User>;
اشتباه رایج
اشتباه رایج تلاش برای تعریف یک Union Type با interface است؛ interface فقط برای شکل شیء مناسب است و امکان تعریف مستقیم چیزی مثل "pending" | "active" را ندارد، این موارد باید حتماً با type نوشته شوند.
جمعبندی
برای شکل اشیاء و کلاسها که ممکن است بعداً گسترش یابند از interface و برای Union، Intersection و نوعهای پیچیدهتر از type استفاده کنید.
