interface
jest, gdy chcesz po prostu opisać kształt obiektu. Nie ma generowania kodu dla interfejsów - są one wyłącznie artefaktem w systemie typów. Nie zobaczysz żadnej różnicy w generowaniu kodu dla klasy w zależności od tego, czy ma ona klauzulę implements
.
declare class
jest, gdy chcemy opisać istniejącą klasy (zwykle klasę maszynopis, ale nie zawsze), który będzie obecny na zewnątrz (na przykład, masz dwie .TS pliki kompilacji dwóch js pliki i oba są zawarte w tagach script
na stronie internetowej). Jeśli odziedziczysz po class
używając extends
(niezależnie od tego, czy podstawowym typem był declare class
czy zwykły class
), kompilator wygeneruje cały kod, aby podłączyć łańcuch prototypów i konstruktorów forwardujących, a co nie.
Jeśli spróbujesz odziedziczyć po declare class
, który powinien być interfejsem, wystąpi błąd środowiska wykonawczego, ponieważ wygenerowany kod będzie odwoływał się do obiektu bez manifestowania środowiska wykonawczego.
Odwrotnie, jeśli po prostu implement
interfejs, który powinien był declare class
, będziesz musiał ponownie wdrożenia wszystkich członkach siebie i nie będzie wykorzystanie dowolnego kodu ponownego wykorzystania z would- być klasą podstawową, a funkcje sprawdzające łańcuch prototypów w środowisku wykonawczym odrzucają obiekt jako nie będący instancją klasy bazowej.
Aby uzyskać naprawdę nerdy, jeśli masz C++ tła, można z grubsza myśleć interface
jak typedef
i declare class
jako deklaracja konstruktora, który ściśle brakuje definicji w tej jednostce kompilacji extern
.
Z czystej strony konsumpcji (pisanie kodu nadrzędną, nie dodając nowe typy), jedyna różnica między interface
i declare class
jest to, że nie można new
interfejs. Jednakże, jeśli zamierzasz extend
/implement
jeden z tych typów w nowym class
, absolutnie musiał wybrać poprawnie między interface
i declare class
. Tylko jeden z nich zadziała.
Dwie zasady, które będą dobrze służyć:
- Czy nazwa wyrównywania typu z funkcji konstruktora (coś invokable z
new
) to rzeczywiście obecny w czasie wykonywania (np Date
jest, ale JQueryStatic
nie jest) ? Jeśli nr, na pewno chcesz interface
- Mam do czynienia z skompilowanej klasy z innego pliku TypeScript, czy coś dostatecznie podobne? Jeśli yes użyć
declare class
Zobacz http://stackoverflow.com/a/14323673/1704166 –
Nie wydaje mi się, aby któryś z nich naprawdę pomógł opisać, że użyjesz jednego nad drugim, ponieważ oba mogą osiągnąć to samo, bez wyjścia JS. – Chris