2016-09-12 3 views
4

ТипScript, похоже, имеет важную небольшую функцию, которая позволяет добавлять членов в существующее определение интерфейса. В интерфейсах члены являются аддитивными, поэтому, если вы определяете интерфейс с набором членов, вы можете определить интерфейс во второй раз, чтобы добавить дополнительных членов в интерфейс.Как добавить членов в существующее определение в flowjs

У меня есть предопределенный внешний файл определения flowjs так:

declare class JQueryStatic { 
    ajax(url: string, settings?: any): any; 
} 
declare var jQuery: JQueryStatic; 
declare var $: JQueryStatic; 

А теперь хотелось бы, чтобы добавить новый метод myPlugin(settings?: any): any; к классу JQueryStatic.

Это ключ к поддержке плагинов jQuery строго типизированным способом.

Каков предложенный способ сделать это в потоке?

+0

Пожалуйста, прочтите тег 'flow-js' des des cription - это не для 'flowtype' –

+0

@RyanCavanaugh Спасибо! – doberkofler

ответ

1

Пересечение - это путь.

Сначала нужно базовое определение для JQuery, скажем, это выглядит следующим образом:

// here we declare shape of jquery 
declare class $GlobalJquery { 
    foo(): void 
} 

// here we declare global reference to jquery 
declare var $: $GlobalJquery; 

Следующая вещь, которую нам нужно, чтобы объявить форму плагин где:

interface SomeJqueryPlugin { 
    bar(): void; // plugin adds bar() function to jquery 
} 

И наконец, мы redeclare $, когда нам нужно использовать функциональность плагина:

declare var $: $GlobalJquery & SomeJqueryPlugin; 

$.foo(); 
$.bar(); 
1

Перекрестные типы могут работать для вас.

type A = { foo: string; }; 
type B = { bar: string; }; 
type AB = A & B; 

AB имеет тип { foo: string; bar: string;};

Из https://github.com/Microsoft/TypeScript/issues/1265 (см «Тип Пересечения»)

+0

Это не сработает. Потому что 'AB' не изменится, как ведет себя что-то типа' A'. (предполагая, что 'A' - это то, что предоставит jquery.flowtype) – basarat

+0

Если бы у меня был пример, чтобы уйти, я мог бы, возможно, понять проблему лучше, я сам не использую jquery (не предполагал самонадеянности). – Nikita

+0

@ Никита Я добавил простой пример – doberkofler

0

Существует уже открытый вопрос о создании таких деклараций файлов: https://github.com/facebook/flow/issues/2421

Он не получил никакого внимания, но это может (его лишь 5 дней до сих пор)

+0

Это, похоже, очень общая проблема, поэтому я тоже пробовал здесь. Я новичок в flowjs и ожидал, что это будет без проблем для экспертов Flowjs. – doberkofler

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