Ответ 1
Проблема с плагинами jQuery (и другими плагинами) заключается в том, что вам нужен не только файл library.d.ts для базовой библиотеки, но вам также нужен файл plugin.d.ts для каждого плагина. И как-то файлы thes plugin.d.ts должны расширять библиотечные интерфейсы, определенные в файлах library.d.ts. К счастью, TypeScript имеет отличную небольшую функцию, которая позволяет вам делать именно это.
С classes
в настоящее время может быть только одно кононическое определение класса внутри проекта. Поэтому, если вы определяете class Foo
, вы все, что вы ставите на Foo
, все, что вы получаете. Любые дополнительные определения Foo
приведут к ошибке. Однако с interfaces
члены являются аддитивными, поэтому, если вы определяете interface Bar
с набором элементов, вы можете определить "панель интерфейса" второй раз, чтобы добавить дополнительных членов в interface
. Это ключ к поддержке плагинов jQuery строго типизированным способом.
Итак, чтобы добавить поддержку для данного плагина jQuery, вам понадобится создать файл plugin.d.ts для плагина, который вы хотите использовать. Мы используем jQuery Templates в нашем проекте, так что вот файл jquery.tmpl.d.ts, который мы создали, чтобы добавить поддержку этого плагина:
interface JQuery
{
tmpl(data?:any,options?:any): JQuery;
tmplItem(): JQueryTmplItem;
template(name?:string): ()=>any;
}
interface JQueryStatic
{
tmpl(template:string,data?:any,options?:any): JQuery;
tmpl(template:(data:any)=>string,data?:any,options?:any): JQuery;
tmplItem(element:JQuery): JQueryTmplItem;
tmplItem(element:HTMLElement): JQueryTmplItem;
template(name:string,template:any): (data:any)=>string[];
template(template:any): JQueryTemplateDelegate;
}
interface JQueryTemplateDelegate {
(jQuery: JQueryStatic, data: any):string[];
}
interface JQueryTmplItem
{
data:any;
nodes:HTMLElement[];
key:number;
parent:JQueryTmplItem;
}
Прерывая это, первое, что мы сделали, это определить методы, которые добавляются в интерфейс JQuery
. Это позволяет вам получать intellisense и проверку типов при вводе $('#foo').tmpl();
Далее мы добавили методы в интерфейс JQueryStatic
, которые появляются при вводе $.tmpl();
И, наконец, jQuery Templates плагин определяет некоторые из своих собственных структур данных, поэтому нам нужно было определить интерфейсы для этих структур.
Теперь, когда мы определили дополнительные интерфейсы, нам просто нужно ссылаться на них из потребляющих файлов .ts. Для этого мы просто добавляем ссылки ниже в начало нашего файла .ts и его. Для этого файла TypeScript будет видеть как базовые методы jQuery, так и методы плагина. Если вы используете несколько плагинов, просто убедитесь, что вы ссылаетесь на все ваши отдельные файлы plugin.d.ts, и вы должны быть хорошими.
/// <reference path="jquery.d.ts"/>
/// <reference path="jquery.tmpl.d.ts" />