Интерфейсы не переведены в код JavaScript. Они существуют только во время компиляции для проверки типов. Вы не можете расширить функцию-конструктор, которая не существует. Обычным способом сделать это будет создание класса, реализующего Validator
.
Теперь, в то время как машинопись не допускает объединение классов и интерфейсов, делает позволяет объединяет вар с интерфейсом, а переменные может содержать реализацию Validator
. Вот как это работает:
export interface Validator {
parseDynamicContent: (selector: string) => void;
}
Затем создайте класс реализации. Вы можете сохранить это скрытым, если вы не хотите, чтобы другие классы расширяли свое поведение.
class ValidatorImpl implements Validator {
constructor() {}
parseDynamicContent: (selector: string) => void;
}
Теперь вы создаете var для объединения с интерфейсом. Var будет иметь тип, который соответствует статической стороне ValidatorImpl
, которая включает в себя конструктор, и все члены явно объявили static
coure. Эта переменная будет иметь реализующий класс, присвоенный ему:
var Validator: {
new(): Validator;
} = ValidatorImpl;
Напомним, что под капотом класса является функция конструктор, поэтому назначение совместимо. Соединенный в один файл, фрагменты кода выше компиляции в этом:
var ValidatorImpl = (function() {
function ValidatorImpl() {
this.parseDynamicContent = null;
}
return ValidatorImpl;
})();
var Validator = ValidatorImpl;
Таким образом, вы получите ваш торт и получить его съесть: D. Вы можете реализовать Validator
в классах, полученных от ValidatorImpl
или с нуля, или вообще забыть о классах - любая запись, которую вы создаете «на лету», которая содержит член parseDynamicContent
с правильным типом, будет приниматься везде, где ожидается Validator
.
Надеюсь, что это поможет.