Як я можу зупинити синтаксичні помилки “властивість не існує у типі JQuery” під час використання Typescript?


80

Я використовую лише один рядок jQuery у своєму додатку:

$("div.printArea").printArea();

Але це видає мені помилку Typescript:

Властивість 'printArea' не існує для типу JQuery?

Хтось може сказати мені, як я можу зупинити появу цієї помилки?

Відповіді:


188

Ви можете передати його <any>або розширити введення jquery, щоб додати свій власний метод.

 (<any>$("div.printArea")).printArea();

// Або додайте власні власні методи (припускаючи, що це додано вами самим як частина користувацького плагіна)

interface JQuery {
    printArea():void;
}

дає мені:Error:(44, 23) TS2339: Property 'printArea' does not exist on type 'ElementFinder'.
user47376

Якщо ви спробуєте interface JQueryшлях у зовнішньому модулі та визначите параметр функції як тип JQuery та спробуєте викликати його з іншого файлу, TypeScript поскаржиться, що існує два типи з іменем JQuery, які не пов’язані між собою.
Сем Рюбі

Оголошення про інтерфейс здається чудовим. Крім того, він набагато чистіший, ніж кастинг <any> скрізь
Розшифрований

Це не працювало для мене, але врешті-решт я натрапив на stackoverflow.com/questions/30960386/… і зрозумів, що мені потрібно declare global { ... }навколо декларації інтерфейсу.
Джеймс Хопкін,

44

Я думаю, що це найбільш читабельне рішення:

($("div.printArea") as any).printArea();

12

Ви можете кинути його

(<any>$('.selector') ).function();

Наприклад: засіб вибору дати ініціалізується за допомогою jquery

(<any>$('.datepicker') ).datepicker();

3

Для вашого прикладу ви б додали таке:

interface JQuery{
    printArea():void;
}

Редагувати: ой, басарат правильний нижче. Я не впевнений, чому я думав, що це компіляція, але я оновив цю відповідь.


Ні. Він обертає предмет $. Це вже не статичні долари
basarat

Хм, ви впевнені? Я перевірив це в проекті, і це спрацювало.
AlexB

Так. Ваша справа Справа $.inviewport(el)Ops$('selector').printArea
Басарат

Вибачте, не маю на увазі, але мій код працює для мене. Здається, питання полягає в тому, щоб змусити код скомпілювати, тож якщо мій код компілюється, в чому проблема з ним? Зауважте, мій другий приклад використання printArea () також працює.
AlexB

$('selector').printAreaскладає? Я не думаю. $.printAreaвсе-таки скомпілює. Ви були дуже ввічливими, тому не ображайте і не
замислюйтесь

2

Оскільки printArea - це плагін jQuery, він не входить до jquery.d.ts.

Вам потрібно створити файл визначення jquery.printArea.ts.

Якщо ви створюєте повний файл визначення для плагіна, ви можете надіслати його до DefinitelyTyped .


І переконайтеся, що ваш tsconfig.json теж налаштований правильно. Якщо він має параметр "типи", тоді будуть розпізнаватися лише перелічені типи. Якщо ні, тоді він розпізнає все в node_modules / @ типи
Ден Кенкро

2

Ви також можете написати це так:

let elem: any;
elem = $("div.printArea");
elem.printArea();

2

Ви також можете використовувати синтаксис ігнорування замість того, щоб використовувати (або краще "як будь-який") позначення:

// @ts-ignore
$("div.printArea").printArea();
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.