Middle
Када треба користити типове, а када интерфејсе у TypeScript-у?
sobes.tech АИ
Одговор од АИ
Типови (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 је флексибилнији.