Oba mechanizmy — interface i type alias — pozwalają na opisywanie struktur danych (obiektów, funkcji, złożonych typów).
Różnice:
|) 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:
interface.type.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 }
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ę.