¿Cómo puedo detener los errores de sintaxis de "la propiedad no existe en el tipo JQuery" cuando utilizo TypeScript?


80

Solo estoy usando una línea de jQuery en mi aplicación:

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

Pero esto me está dando un error de TypeScript:

¿La propiedad 'printArea' no existe en el tipo JQuery?

¿Alguien puede decirme cómo puedo evitar que aparezca este error?

Respuestas:


188

Puede convertirlo en <any>jquery o extenderlo para agregar su propio método.

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

// O agregue sus propios métodos personalizados (suponiendo que usted mismo lo agregue como parte del complemento personalizado)

interface JQuery {
    printArea():void;
}

dándome:Error:(44, 23) TS2339: Property 'printArea' does not exist on type 'ElementFinder'.
user47376

Si intenta el interface JQuerycamino en un módulo externo y define un parámetro de función como un tipo JQuery e intenta llamarlo desde otro archivo, TypeScript se quejará de que hay dos tipos llamados JQuery que no están relacionados.
Sam Rueby

Declarar la interfaz parece funcionar muy bien. También es mucho más limpio que enviar contenido a <cualquier> en todas partes
decodificado

Esto no funcionó para mí, pero finalmente me encontré con stackoverflow.com/questions/30960386/… y me di cuenta de que necesitaba declare global { ... }la declaración de interfaz.
James Hopkin

44

Creo que esta es la solución más legible:

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

12

Puedes lanzarlo a

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

Ej: selector de fecha inicializar usando jquery

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

3

Para su ejemplo, agregaría esto:

interface JQuery{
    printArea():void;
}

Editar: oops, basarat es correcto a continuación. No estoy seguro de por qué pensé que se estaba compilando, pero actualicé esta respuesta.


No Está envolviendo un objeto con $. Ya no es estático $
basarat

Hmm, ¿estás seguro? Lo probé en un proyecto y funcionó.
AlexB

Sip. Su caso $.inviewport(el)Caso de $('selector').printArea
operaciones

Lo siento, no quiero quejarme, pero mi código funciona para mí. La pregunta parece ser acerca de cómo compilar el código, así que si mi código se compila, ¿cuál es el problema? Tenga en cuenta que mi segundo ejemplo con printArea () también funciona.
AlexB

$('selector').printAreacompila? No lo creo. $.printAreacompilará sin embargo. Usted ha sido muy amable por lo que ninguna ofensa ejecutados o dispuestos :)
Basarat

2

Dado que printArea es un complemento de jQuery, no está incluido en jquery.d.ts.

Necesita crear un archivo de definición jquery.printArea.ts.

Si crea un archivo de definición completo para el complemento, es posible que desee enviarlo a DefinitelyTyped .


Y asegúrese de que su tsconfig.json también esté configurado correctamente. Si tiene una configuración de "tipos", solo se reconocerán los tipos enumerados. De lo contrario, reconocerá todo en node_modules / @ types
Dan Cancro

2

También puedes escribirlo así:

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

2

También puede usar la sintaxis de ignorar en lugar de usar (o mejor la notación 'como cualquier'):

// @ts-ignore
$("div.printArea").printArea();
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.