Middle
Кога трябва да използвате типове и кога интерфейси в TypeScript?
sobes.tech AI
Отговор от AI
Типовете (type) трябва да се използват за:
- Обединения (unions) и пресичания (intersections):
type Status = "pending" | "completed" | "failed"; type UserWithAddress = User & Address; - Примитивни типове и литерали:
type ID = string | number; type Direction = "up" | "down" | "left" | "right"; - Кортежи (tuples):
type RgbColor = [number, number, number]; - Създаване на алиаси за съществуващи типове:
type StringOrNumber = string | number; - Условни типове (conditional types):
type TypeOfProp<T, K extends keyof T> = T[K];
Интерфейси (interface) трябва да се използват за:
- Описание на структурата на обекти:
interface User { id: number; name: string; age?: number; // Опционално свойство } - Реализация чрез класове (implements):
interface Logger { log(message: string): void; } class ConsoleLogger implements Logger { log(message: string) { console.log(message); } } - Разширяване на други интерфейси (extends):
interface Person { name: string; } interface Employee extends Person { employeeId: number; } - Декларативно сливане (declaration merging): Това позволява да се разшири съществуващ интерфейс, като се обяви отново. С типовете това не е възможно.
interface Box { width: number; } interface Box { // Това ще добави свойството height към интерфейса Box height: number; }
Кратко сравнение:
| Особеност | type |
interface |
|---|---|---|
| Обединяващи типове | Да | Не |
| Пресичащи типове | Да | Не |
| Примитивни типове/литерали | Да | Не |
| Кортежи | Да | Не |
| Алиаси на типове | Да | Не |
| Условни типове | Да | Не |
| Описание на обекти | Да | Да |
| Реализация чрез класове | Не | Да |
| Разширение | Да (с използване на &) |
Да (с използване на extends) |
| Декларативно сливане | Не | Да |
Общо взето, за описание на структурата на обекти е по-подходящо да се използва interface, тъй като е по-добре пригоден за обектно-ориентиран подход и поддържа декларативно сливане. За всичко останало, особено за комбинации и създаване на нови типове от съществуващи, type е по-гъвкав.