В чем разница между "объявить класс" и "интерфейс" в TypeScript
в TypeScript, при создании .D. TS исходные файлы объявлений, что предпочтительнее и почему?
declare class Example {
public Method(): void;
}
или
interface Example {
Method(): void;
}
различия, что я могу сказать, что интерфейсы не могут иметь статические методы, так что вы должны использовать класс для этого. Оба не производят никакого вывода JS, так что, возможно, это не имеет значения?
3 ответов:
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
Вы можете реализовать интерфейс:
class MyClass implements Example { Method() { } }а
declare classсинтаксис действительно предназначен для добавления определений типов для внешнего кода, который не написан в TypeScript, поэтому реализация "в другом месте".
в терминах непрофессионала,
declareиспользуется.ts/d.tsфайлы, чтобы сообщить компилятору, что мы должны ожидать ключевое слово мыdeclaringсуществовать в этой среде, даже если она не определена в данном файле. Это позволит нам иметь безопасность типов при использовании объявленного объекта, так как компилятор Typescript теперь знает, что некоторые другие компоненты могут предоставлять эту переменную.
Comments