Jaka jest różnica między tymi instrukcjami (interfejs vs typ)?
interface X {
a: number
b: string
}
type X = {
a: number
b: string
};
typescript
wonea
źródło
źródło
Odpowiedzi:
Zgodnie ze specyfikacją języka TypeScript :
Specyfikacja wspomina dalej:
źródło
interface Point { x: number; } interface Point { y: number; }
extends or implements
już nie ma miejsca. Typ można rozszerzyć i zaimplementować za pomocąclass
. Oto przykład typescriptlang.org/play/...Aktualizacja 2019
Obecne odpowiedzi i oficjalna dokumentacja są nieaktualne. A dla tych, którzy nie znają TypeScript, zastosowana terminologia nie jest jasna bez przykładów. Poniżej znajduje się lista aktualnych różnic.
1. Obiekty / funkcje
Oba mogą być użyte do opisania kształtu obiektu lub sygnatury funkcji. Ale składnia jest różna.
Berło
Wpisz alias
2. Inne typy
W przeciwieństwie do interfejsu, alias typu może być również używany dla innych typów, takich jak operacje podstawowe, związki i krotki.
3. Przedłuż
Oba można rozszerzyć, ale znowu składnia jest różna. Dodatkowo zauważ, że interfejs i alias typu nie wykluczają się wzajemnie. Interfejs może rozszerzyć alias typu i odwrotnie.
Interfejs rozszerza interfejs
Alias typu rozszerza alias typu
Interfejs rozszerza alias typu
Alias typu rozszerza interfejs
4. Implementuje
Klasa może implementować interfejs lub alias typu, oba w ten sam dokładny sposób. Należy jednak pamiętać, że klasa i interfejs są uważane za statyczne plany. Dlatego nie mogą implementować / rozszerzać aliasu typu, który nazywa typ unii.
5. Połączenie deklaracji
W przeciwieństwie do aliasu typu interfejs można zdefiniować wiele razy i będzie on traktowany jako pojedynczy interfejs (z scalonymi elementami wszystkich deklaracji).
źródło
type
lubinterface
? Nadal jestem zdezorientowany, kiedy powinienem użyć jednego lub drugiego.Począwszy od TypeScript 3.2 (listopad 2018), spełnione są następujące warunki:
źródło
type
pewnych ograniczeń (i od TypeScript 3.7 te ograniczenia również zniknęły). Interfejsy mogą rozszerzać typy. Klasy mogą implementować typy. Co więcej, przedstawienie danych jako zrzut ekranu tabeli powoduje, że są one całkowicie niedostępne dla osób z zaburzeniami widzenia.https://www.typescriptlang.org/docs/handbook/advanced-types.html
źródło
Przykłady z typami:
// utwórz strukturę drzewa dla obiektu. Nie możesz zrobić tego samego z interfejsem z powodu braku skrzyżowania (&)
// wpisz, aby ograniczyć zmienną do przypisania tylko kilku wartości. Interfejsy nie mają związku (|)
// dzięki typom możesz zadeklarować typ NonNullable dzięki mechanizmowi warunkowemu.
Przykłady z interfejsem:
// możesz użyć interfejsu dla OOP i użyć „implements” do zdefiniowania szkieletu obiektu / klasy
// możesz rozszerzyć interfejsy o inne interfejsy
źródło
Oprócz podanych już genialnych odpowiedzi istnieją zauważalne różnice, jeśli chodzi o rozszerzanie typów w porównaniu z interfejsami. Niedawno natknąłem się na kilka przypadków, w których interfejs nie może wykonać zadania:
źródło
dokumentacja wyjaśniła
Interfejsy a aliasy typu
źródło