Middle
Kedy by ste mali v TypeScript používať typy a kedy rozhrania?
sobes.tech AI
Odpoveď od AI
Typy (type) by sa mali používať na:
- Unions (sjednotenia) a intersections (prieniky):
type Status = "pending" | "completed" | "failed"; type UserWithAddress = User & Address; - Primitívne typy a literály:
type ID = string | number; type Direction = "up" | "down" | "left" | "right"; - Tuply (tuples):
type RgbColor = [number, number, number]; - Vytváranie aliasov pre existujúce typy:
type StringOrNumber = string | number; - Podmienkové typy (conditional types):
type TypeOfProp<T, K extends keyof T> = T[K];
Rozhrania (interface) by sa mali používať na:
- Popis štruktúry objektov:
interface User { id: number; name: string; age?: number; // voliteľná vlastnosť } - Implementácia triedami (implements):
interface Logger { log(message: string): void; } class ConsoleLogger implements Logger { log(message: string) { console.log(message); } } - Rozšírenie iných rozhraní (extends):
interface Person { name: string; } interface Employee extends Person { employeeId: number; } - Deklaratívne zlúčenie (declaration merging): Toto umožňuje rozšíriť existujúce rozhranie jeho opakovaným vyhlásením. S typmi to nie je možné.
interface Box { width: number; } interface Box { // Toto pridá vlastnosť height k rozhraniu Box height: number; }
Stručné porovnanie:
| Vlastnosť | type |
interface |
|---|---|---|
| Union typy | Áno | Nie |
| Intersection typy | Áno | Nie |
| Primitívne typy/literály | Áno | Nie |
| Tuply | Áno | Nie |
| Aliasy typov | Áno | Nie |
| Podmienkové typy | Áno | Nie |
| Popis objektov | Áno | Áno |
| Implementácia triedami | Nie | Áno |
| Rozšírenie | Áno (&) |
Áno (extends) |
| Deklaratívne zlúčenie | Nie | Áno |
Vo všeobecnosti je vhodnejšie použiť interface na opis štruktúry objektov, pretože lepšie zodpovedá objektovo orientovanému prístupu a podporuje deklaratívne zlúčenie. Na všetko ostatné, najmä na kombinácie a tvorbu nových typov z existujúcich, je flexibilnejší type.