interfaceце для того, коли ви просто хочете описати форму предмета. Ніколи не існує генерації коду для інтерфейсів - вони виключно артефакт в системі типів. Ви не побачите різниці в генерації коду для класу залежно від того, чи має він implementsзастереження.
declare classпризначений для того, коли ви хочете описати існуючий клас (як правило, клас TypeScript, але не завжди), який буде присутній зовні (наприклад, у вас є два .ts файли, що компілюються у два файли .js, і обидва включаються через scriptтеги на веб-сторінці). Якщо ви успадковуєте за classдопомогою extends(незалежно від того, базовий тип був declare classчи звичайним class), компілятор збирається створити весь код для підключення прототипу ланцюга та конструкторів переадресації, а що ні.
Якщо ви спробуєте успадкувати той, declare classякий повинен був бути інтерфейсом, у вас виникне помилка виконання, оскільки цей сформований код буде посилатися на об'єкт без прояву виконання.
І навпаки, якщо ви просто implementінтерфейс, який повинен був бути declare class, вам доведеться самостійно повторно впроваджувати всі учасники, і ви не будете використовувати переваги повторного використання коду з потенційного базового класу та функцій яка перевіряє ланцюг прототипу під час виконання, відхилить ваш об'єкт як фактично не екземпляр базового класу.
Якщо ви дійсно нерозумні, якщо у вас є C ++, ви можете грубо мислити interfaceяк typedefі declare classяк externдекларація конструктора, який строго не має визначення у цьому блоці компіляції.
Від чистої боку споживання (написання імперативного коду, не додавання нових типів), єдина відмінність між interfaceі в declare classтому , що ви не можете newінтерфейс. Однак, якщо ви маєте намір extend/ implementодин із цих типів у новому class, ви абсолютно повинні правильно обрати між interfaceі declare class. Працює лише одна з них.
Два правила, які вам добре послужать:
- Чи ім'я типу вирівнювання з функцією конструктора (з
newякою можна викликати ), яка насправді присутня під час виконання (наприклад, Dateє, але JQueryStaticні)? Якщо ні , то ви точно хочетеinterface
- Я маю справу зі складеним класом з іншого файлу TypeScript або чимось достатньо схожим? Якщо так , використовуйте
declare class