programowanieFullstack deweloper

Opowiedz o interfejsach (interface) i typach (type alias) w TypeScript. Jakie są między nimi różnice, w jakich sytuacjach wybrać podejście jedno lub drugie?

Zdaj rozmowy kwalifikacyjne z asystentem AI Hintsage

Odpowiedź.

Oba mechanizmy — interface i type alias — pozwalają na opisywanie struktur danych (obiektów, funkcji, złożonych typów).

  • Interfejs — klasyczne ogłoszenie interfejsu. Umożliwia rozszerzanie interfejsów, łączenie (declaration merging), łatwe dziedziczenie.
  • Typ alias — tworzy nowy pseudonim typu. Można je łączyć za pomocą unii / przecięcia, przypisywać dowolnym jednostkom: prymitywom, funkcjom, krotkom itd.

Różnice:

  • Rozszerzalność: interfejs lepiej nadaje się do struktur obiektowych, wspiera deklaracyjne łączenie.
  • Elastyczność: typ alias jest uniwersalny, nadaje się do wszystkiego: unii (|) i przecięć (&).

Przykład:

interface Animal { name: string } interface Dog extends Animal { bark(): void } // type alias dla połączenia typów: type MyType = string | number type Cat = Animal & { purr(): void }

Zalecane:

  • Dla publicznych API — używać interface.
  • Dla złożonych połączeń i alias-ów — używać type.

Pytanie z haczykiem.

Pytanie: Czy można dodać nowe pole do typu zdefiniowanego za pomocą type alias w innym pliku?

Odpowiedź:

Nie. Typ alias nie może być rozszerzany deklaratywnie z innego pliku, w przeciwieństwie do interfejsu.

Przykład:

// main.ts type User = { name: string } // another.ts type User = { age: number } // Błąd: Zduplikowany identyfikator // interfejs: // main.ts interface User { name: string } // another.ts interface User { age: number } // Ok, User = { name: string, age: number }

Przykłady rzeczywistych błędów z powodu braku znajomości niuansów tematu.


Historia

W dużym projekcie definiowano wspólne struktury danych przez type alias. Gdy zajęło się dodanie pola do istniejącego typu z innego pakietu, okazało się, że type alias nie wspiera declaration merging — trzeba było przepisać na interfejs, co spowodowało opóźnienia.


Historia

Jeden z programistów opisał funkcje przez interfejs, a następnie próbował dodać typ Unii (ciąg lub funkcję) — okazało się, że interfejs do tego się nie nadaje i trzeba było zmieniać wszystkie definicje na type alias z przecięciem/unią.


Historia

Po zmianie typu z interfejsu na type alias pomylili składnię rozszerzenia: próbowali używać extends, zamiast łączyć przez &. Błąd objawił się późno i nie od razu zrozumieli przyczynę.