Cómo usar jQuery con TypeScript

158

estoy intentando

$(function(){ 
    alert('Hello'); 
});

Su mostrando este error en Visual Studio: (TS) Cannot find name '$'.. ¿Cómo puedo usar jQuery con TypeScript?

JavaScript Linq
fuente
3
Puede incluir esta líneaimport * as $ from "jquery";
jcubic

Respuestas:

210

Lo más probable es que necesite descargar e incluir el archivo de declaración TypeScript para jQuery jquery.d.tsen su proyecto.

Opción 1: instale el paquete @types (recomendado para TS 2.0+)

En la misma carpeta que su archivo package.json , ejecute el siguiente comando:

npm install --save-dev @types/jquery

Luego, el compilador resolverá las definiciones de jquery automáticamente.

Opción 2: descargar manualmente (no recomendado)

Descárgalo aquí .

Opción 3: Uso de tipings (Pre TS 2.0)

Si usa tipings , puede incluirlo de esta manera:

// 1. Install typings
npm install typings -g
// 2. Download jquery.d.ts (run this command in the root dir of your project)
typings install dt~jquery --global --save

Después de configurar el archivo de definición, importe el alias ( $) en el archivo TypeScript deseado para usarlo como lo haría normalmente.

import $ from "jquery";
// or
import $ = require("jquery");

Puede que necesite compilar con --allowSyntheticDefaultImports—add "allowSyntheticDefaultImports": trueen tsconfig.json .

Instalar también el paquete?

Si no tiene jquery instalado, probablemente desee instalarlo como una dependencia a través de npm (pero este no es siempre el caso):

npm install --save jquery
David Sherret
fuente
66
Tuve que reiniciar el estudio visual para que funcione, pequeño paso, pero me hizo tropezar un poco.
William Howley
1
@daslicht revisa esta pregunta
David Sherret
66
para ayudar a otros: entonces solo necesita instalar jquery: npm install jquery y usarlo con import $ = require ('jquery');
Jonathan
28
También podría usarimport * as $ from 'jquery'
gldraphael
1
Recibo un errorError TS1192 Module '"jquery"' has no default export.
Karthik
29

En mi caso tuve que hacer esto

npm install @types/jquery --save-dev // install jquery type as dev dependency so TS can compile properly
npm install jquery --save // save jquery as a dependency

Luego en el archivo de script A.ts

import * as $ from "jquery";
... jquery code ...
Shobi
fuente
26

PARA el código de Visual Studio

Lo que funciona para mí es asegurarme de hacer la carga estándar de la biblioteca JQuery a través de una etiqueta <script> en el index.html.

correr

npm install --save @types/jquery

Ahora las funciones JQuery $ están disponibles en todos los archivos .ts, sin necesidad de ninguna otra importación.

Sydwell
fuente
2
Debe declarar jquery / $ en su componente, si TsLint está activado para este tipo de comprobaciones de tipo. Por ej. javascript declare var jquery: any; declare var $: any;
phoenisx
1
@Subroto, su sugerencia está funcionando bien. Ponlo como respuesta. Gracias.
yW0K5o
21

Creo que puede necesitar los tipos de letra mecanografiada para JQuery. Como dijiste que estás usando Visual Studio, puedes usar Nuget para obtenerlos.

https://www.nuget.org/packages/jquery.TypeScript.DefinitelyTyped/

El comando en Nuget Package Manager Console es

Install-Package jquery.TypeScript.DefinitelyTyped

Actualización: Como se señaló en el comentario, este paquete no se ha actualizado desde 2016. Pero aún puede visitar su página de Github en https://github.com/DefinitelyTyped/DefinitelyTyped y descargar los tipos. Navegue por la carpeta de su biblioteca y luego descargue el index.d.tsarchivo allí. Pop en cualquier parte de su directorio de proyecto y VS debería usarlo de inmediato.

Licht
fuente
2
El paquete nuget para DefinitelyTypes ya no se mantiene. Obtendrá una versión anterior si hace esto.
Dave de Jong
17

Para angular CLI V7

npm install jquery --save
npm install @types/jquery --save

Asegúrese de que jquery tenga una entrada en angular.json -> scripts

...
    "scripts": [
        "node_modules/jquery/dist/jquery.min.js"
    ]
...

Vaya a tsconfig.app.json y agregue una entrada en "tipos"

{
    "extends": "../tsconfig.json",
    "compilerOptions": {
        "outDir": "../out-tsc/app",
        "types": ["jquery","bootstrap","signalr"]
    },
    "exclude": [
        "test.ts",
        "**/*.spec.ts"
    ]
}
El único
fuente
La propiedad 'modal' no existe en el tipo 'JQuery <HTMLElement>'. obteniendo este error después de agregar
user2900572
12

ACTUALIZACIÓN 2019:

La respuesta de David es más precisa.

TypeScript admite bibliotecas de proveedores de terceros, que no utilizan Typecript para el desarrollo de bibliotecas, utilizando DefinitelyTyped Repo .


Debe declarar jquery/ $en su componente, si tsLint está activado para este tipo de comprobaciones de tipo.

Por ej.

declare var jquery: any;
declare var $: any;
Phoenisx
fuente
"si tienen su mecanografía instalada" no lo consigo. ¿Quieres decir NO instalado? ¿Por qué declararlos de otra manera? Solo quiero compilar sin errores y no instalar ningún material adicional y estoy trabajando con libs que no tienen tipos para instalar.
redanimalwar
@redanimalwar Creo que escribí eso, porque en proyectos web como reactjs / angular, si webpack se configura manualmente, las bibliotecas de terceros se definen globalmente, y es difícil decirle a webpack de dónde se importan estas bibliotecas, por lo tanto, declarese usa la palabra clave. Pero, aún podemos decirle a vscode acerca de los tipings si están presentes node_modules, por eso la instalación de tipings ayuda en intellisense, pero para un proyecto webpack de vainilla, sin fallas en la traducción del proyecto de declarepalabras clave. He eliminado mi declaración de la respuesta, para no confundir a las personas.
phoenisx
De todos modos, no he jugado con Angular / Typecript durante mucho tiempo, pero creo que si se instalan los tipos, podríamos haber hecho algo como esto import JQuery from 'jquery'; declare var $: JQuery;. No estoy seguro, si esto funcionará.
phoenisx
He estado usando - typescriptlang.org/docs/handbook/… , en tsconfig, para suprimir problemas de tipo de terceros.
phoenisx
3

Si desea usar jquery en una aplicación web (por ejemplo, React) y jquery ya está cargado con <script src="jquery-3.3.1.js"...

En la página web puedes hacer:

npm install --save-dev @types/query
and the use it with:
let $: JQueryStatic = (window as any)["jQuery"];

entonces, no necesita cargar jquery por segunda vez (con npm install --save jquery) pero tiene todas las ventajas de Typecript

Gerhard Friedrich
fuente
2

Aquí están mis pasos de configuración de TypeScript y jQuery.

Hace que el soporte de tipos de jQuery funcione mejor que la mayoría de los artículos en Internet . ( Yo creo. )

primero:

npm install jquery --save
npm install @types/jquery --save-dev




segundo (muy muy muy importante!!!):

import jquery = require("jquery");



// this helps TypeScript to understand jQuery best !!!  otherwise It will confused .
const $: JQueryStatic = jquery;




entonces, puedes disfrutarlo:

$(document).ready(function () {
    $('btn').click(function () {
       alert('I am clicked !')
    }
}




¡Es suave como la seda!

Lancer.Yan
fuente
entonces, ¿tiene que escribirlo en cada archivo ts de componentes?
Humble Dolt
@HumbleDolt Si vincula jQuery en 【ventana】, solo necesita agregar declare global { interface Window { $ :JQueryStatic; } }suTypeDeclaration.d.ts. Y teniendo en cuenta correctamente, debe comprobar si $ está montado en 【ventana】. Tales como import $ = require('jquery'); window.$ = $ ;, o su jQuery 【$】 ha sido montado por una etiqueta de script externo.
Lancer.Yan
quieres decir, ¿puedes incluir un script en index.html y escribir eso allí? typeDeclaration.ts en angular 8? there is tsconfig.json
Humble Dolt
@HumbleDolt Entonces, puedes probar la segunda solución import $ = require('jquery') ; window.$ = $;. (Será mejor que inicie este, en el punto de inicio de su proyecto. Y prefiero crear un sdkdirectorio, para administrar todos los requisitos de la biblioteca externa e inicial en un archivo o lugar).
Lancer.Yan
@HumbleDolt 【yourTypeDeclaretion.d.ts】 es solo un archivo de tipo definido. Es un archivo especial para definir sus propios tipos. En TypeScript, 【.d.ts】 es solo una forma explícita de aislamiento, para distinguir el reconocimiento de tipo y el código verdadero. También puede escribir el tipo-declaración-snipet en un archivo 【.ts】, todavía funcionará. (tal vez con algún aviso de corrección gramatical)
Lancer
1

Esto funciona para mí ahora y hoy en Angular versión 9

  1. Instale a través de npm this: npm i @ types / jquery simplemente agregue --save para configurarlo globalmente.
  2. Vaya a tsconfig.app.json y agregue la matriz "tipos" jquery.
  3. ng servir y listo.
Solutos Mikaelo
fuente
0

Esto funciona para mi:

export var jQuery: any = window["jQuery"];
Salar
fuente
1
Esto funcionaría, pero no funcionaría tan fuertemente tipado, lo que pierde los beneficios de usarlo con TypeScript y evitarlo si lo hace para bibliotecas externas. Sigue siendo un enfoque bastante interesante.
bnns