В чем разница между "объявить класс" и "интерфейс" в TypeScript



в TypeScript, при создании .D. TS исходные файлы объявлений, что предпочтительнее и почему?



declare class Example {
public Method(): void;
}


или



interface Example {
Method(): void;
}


различия, что я могу сказать, что интерфейсы не могут иметь статические методы, так что вы должны использовать класс для этого. Оба не производят никакого вывода JS, так что, возможно, это не имеет значения?

555   3  

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

    Ничего не найдено.