interfacesłuży do opisywania kształtu przedmiotu. Nie ma nigdy generowania kodu dla interfejsów - są one wyłącznie artefaktem w systemie typów. Nie zobaczysz różnicy w generowaniu kodu dla klasy w zależności od tego, czy ma ona implementsklauzulę.
declare classjest przeznaczony do opisania istniejącej klasy (zwykle klasy TypeScript, ale nie zawsze), która będzie obecna na zewnątrz (na przykład masz dwa pliki .ts, które kompilują się do dwóch plików .js i oba są dołączane za pomocą scripttagów na stronie internetowej). Jeśli dziedziczysz z classusing extends(niezależnie od tego, czy typem podstawowym był typ a, declare classczy zwykły class), kompilator wygeneruje cały kod, aby podłączyć łańcuch prototypów i konstruktory przekazujące, a co nie.
Jeśli spróbujesz dziedziczyć po declare classinterfejsie, który powinien być interfejsem, wystąpi błąd wykonania, ponieważ wygenerowany kod będzie odnosił się do obiektu bez manifestacji środowiska wykonawczego.
I odwrotnie, jeśli po prostu masz implementinterfejs, który powinien być interfejsem declare class, będziesz musiał sam ponownie zaimplementować wszystkie elementy członkowskie i nie będziesz korzystać z ponownego wykorzystania kodu z przyszłej klasy bazowej i funkcji które sprawdzą łańcuch prototypów w czasie wykonywania, odrzucą twój obiekt jako nie będący w rzeczywistości instancją klasy bazowej.
Aby uzyskać naprawdę nerdy, jeśli masz C ++ tła, można z grubsza myśleć interfacejak typedefi declare classjako externdeklaracja konstruktora, który ściśle brakuje definicji w tej jednostce kompilacji.
Od strony czystej konsumpcji (pisanie imperatywnego kodu, a nie dodawanie nowych typów) jedyną różnicą między interfacei declare classjest to, że nie możesz newmieć interfejsu. Jeśli jednak zamierzasz extend/ implementjeden z tych typów w nowym class, koniecznie musisz wybrać poprawnie pomiędzy interfacei declare class. Tylko jeden z nich będzie działać.
Dwie zasady, które będą Ci dobrze służyć:
- Czy nazwa typu jest zgodna z funkcją konstruktora (czymś, z czym można ją wywołać
new), która jest faktycznie obecna w czasie wykonywania (np. DateJest, ale JQueryStaticnie jest)? Jeśli nie , zdecydowanie chceszinterface
- Czy mam do czynienia ze skompilowaną klasą z innego pliku TypeScript, czy z czymś wystarczająco podobnym? Jeśli tak , użyj
declare class