2015-08-07 5 views
0

Я пытаюсь расширить интерфейс ненавязчивой проверки jQuery с помощью дополнительного метода, но по какой-то причине он вообще не получит интерфейс. Ниже приведен фрагмент снизу - это простой фрагмент, который я попробовал запустить на игровой площадке TypeScript в качестве теста, но он утверждает, что он «не может найти имя« Validator », что является нечетным, учитывая, что фрагмент соответствует общему синтаксису для расширения типа в TypeScript, и тот же синтаксис делает Работа в этом answer.Невозможно расширить тип в TypeScript

interface Validator { 
    parseDynamicContent: (selector: string) => void; 
} 

Validator.prototype.parseDynamicContent = function (selector: string): void { 

} 

Я делаю что-то не так, или TypeScript сломан ... снова?

ответ

0

Интерфейсы не переведены в код 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.

Надеюсь, что это поможет.

 Смежные вопросы

  • Нет связанных вопросов^_^