Sobes.tech
Middle

Kdy byste měli v TypeScript používat typy a kdy rozhraní?

sobes.tech AI

Odpověď od AI

Typy (type) by měly být používány pro:

  • Unie (sjednocení) a průniky (průniky):
    type Status = "pending" | "completed" | "failed";
    type UserWithAddress = User & Address;
    
  • Primitivní typy a literály:
    type ID = string | number;
    type Direction = "up" | "down" | "left" | "right";
    
  • Tuply (tuples):
    type RgbColor = [number, number, number];
    
  • Vytváření aliasů pro existující typy:
    type StringOrNumber = string | number;
    
  • Podmíněné typy (conditional types):
    type TypeOfProp<T, K extends keyof T> = T[K];
    

Rozhraní (interface) by měly být používány pro:

  • Popis struktury objektů:
    interface User {
      id: number;
      name: string;
      age?: number; // volitelná vlastnost
    }
    
  • Implementace třídami (implements):
    interface Logger {
      log(message: string): void;
    }
    
    class ConsoleLogger implements Logger {
      log(message: string) {
        console.log(message);
      }
    }
    
  • Rozšíření jiných rozhraní (extends):
    interface Person {
      name: string;
    }
    
    interface Employee extends Person {
      employeeId: number;
    }
    
  • Deklarativní slučování (declaration merging): To umožňuje rozšířit existující rozhraní jeho opětovným oznámením. S typy to není možné.
    interface Box {
      width: number;
    }
    
    interface Box { // To přidá vlastnost height k rozhraní Box
      height: number;
    }
    

Stručné srovnání:

Vlastnost type interface
Unie typy Ano Ne
Průnikové typy Ano Ne
Primitivní typy/literály Ano Ne
Tuply Ano Ne
Aliasy typů Ano Ne
Podmíněné typy Ano Ne
Popis objektů Ano Ano
Implementace třídami Ne Ano
Rozšíření Ano (& použití) Ano (extends použití)
Deklarativní slučování Ne Ano

Obecně platí, že pro popis struktury objektů je vhodnější používat interface, protože lépe odpovídá objektově orientovanému přístupu a podporuje deklarativní slučování. Pro ostatní případy, zejména pro kombinace a tvorbu nových typů z existujících, je flexibilnější type.