Middle
Kiedy używać typów, a kiedy interfejsów w TypeScript?
sobes.tech AI
Odpowiedź od AI
Typy (type) powinny być używane do:
- Unioni (unions) i przecięcia (intersections):
type Status = "pending" | "completed" | "failed"; type UserWithAddress = User & Address; - Typy prymitywne i literały:
type ID = string | number; type Direction = "up" | "down" | "left" | "right"; - Krotki (tuples):
type RgbColor = [number, number, number]; - Tworzenie aliasów dla istniejących typów:
type StringOrNumber = string | number; - Typy warunkowe:
type TypeOfProp<T, K extends keyof T> = T[K];
Interfejsy (interface) powinny być używane do:
- Opisu struktury obiektów:
interface User { id: number; name: string; age?: number; // opcjonalna właściwość } - Implementacji przez klasy (implements):
interface Logger { log(message: string): void; } class ConsoleLogger implements Logger { log(message: string) { console.log(message); } } - Rozszerzania innych interfejsów (extends):
interface Person { name: string; } interface Employee extends Person { employeeId: number; } - Deklaratywne łączenie (declaration merging): Pozwala na rozszerzenie istniejącego interfejsu, deklarując go ponownie. Z typami jest to niemożliwe.
interface Box { width: number; } interface Box { // To doda właściwość height do interfejsu Box height: number; }
Krótko porównanie:
| Cecha | type |
interface |
|---|---|---|
| Typy unii | Tak | Nie |
| Typy przecięcia | Tak | Nie |
| Typy prymitywne/literały | Tak | Nie |
| Krotki | Tak | Nie |
| Alias typów | Tak | Nie |
| Typy warunkowe | Tak | Nie |
| Opis obiektów | Tak | Tak |
| Implementacja przez klasy | Nie | Tak |
| Rozszerzanie | Tak (z użyciem &) |
Tak (z użyciem extends) |
| Deklaratywne łączenie | Nie | Tak |
Ogólnie rzecz biorąc, do opisu struktury obiektów lepiej używać interface, ponieważ lepiej pasuje do podejścia obiektowego i obsługuje deklaratywne łączenie. Do wszystkiego innego, szczególnie do łączenia i tworzenia nowych typów z istniejących, type jest bardziej elastyczny.