วิธีใช้ jQuery กับ TypeScript


158

ฉันกำลังพยายาม

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

มันแสดงให้เห็นข้อผิดพลาดนี้ใน Visual (TS) Cannot find name '$'.Studio: ฉันจะใช้ jQuery กับ TypeScript ได้อย่างไร


3
คุณสามารถรวมบรรทัดนี้ได้import * as $ from "jquery";
jcubic

คำตอบ:


210

เป็นไปได้มากว่าคุณต้องดาวน์โหลดและรวมไฟล์ประกาศ TypeScript สำหรับ jQuery— jquery.d.tsในโครงการของคุณ

ตัวเลือกที่ 1: ติดตั้งแพ็คเกจ @types (แนะนำสำหรับ TS 2.0+)

ในโฟลเดอร์เดียวกับไฟล์package.jsonของคุณให้เรียกใช้คำสั่งต่อไปนี้:

npm install --save-dev @types/jquery

จากนั้นคอมไพเลอร์จะแก้ไขคำจำกัดความของ jquery โดยอัตโนมัติ

ตัวเลือกที่ 2: ดาวน์โหลดด้วยตนเอง (ไม่แนะนำ)

ดาวน์โหลดได้ที่นี่

ตัวเลือก 3: การใช้ Typings (พื้นฐาน TS 2.0)

หากคุณใช้งานพิมพ์คุณสามารถรวมมันได้ด้วยวิธีนี้:

// 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

หลังจากตั้งค่าไฟล์คำนิยามให้อิมพอร์ต alias ( $) ในไฟล์ TypeScript ที่ต้องการเพื่อใช้งานตามปกติ

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

คุณอาจจำเป็นต้องรวบรวมกับ--allowSyntheticDefaultImportsเพิ่ม"allowSyntheticDefaultImports": trueในtsconfig.json

ติดตั้งแพคเกจด้วยหรือไม่

หากคุณไม่ได้ติดตั้ง jquery คุณอาจต้องการติดตั้งเป็นการพึ่งพาผ่าน npm (แต่นี่อาจไม่ใช่ทุกกรณี):

npm install --save jquery

6
ต้องรีบูตสตูดิโอภาพเพื่อให้ทำงานขั้นตอนเล็ก ๆ แต่สะดุดฉันเล็กน้อย
William Howley

1
@daslicht ตรวจสอบคำถามนี้
David Sherret

6
เพื่อช่วยเหลือผู้อื่น: จากนั้นคุณเพียงแค่ต้องติดตั้ง jquery: npm ติดตั้ง jquery และใช้มันด้วย import $ = require ('jquery');
Jonathan

28
สามารถใช้import * as $ from 'jquery'
gldraphael

1
ฉันได้รับข้อผิดพลาดError TS1192 Module '"jquery"' has no default export.
Karthik

29

ในกรณีของฉันฉันต้องทำเช่นนี้

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

จากนั้นในไฟล์สคริปต์ A.ts

import * as $ from "jquery";
... jquery code ...

26

สำหรับVisual Studio รหัส

สิ่งที่ดีสำหรับฉันคือการทำให้แน่ใจว่าฉันทำไลบรารี JQuery มาตรฐานโหลดผ่านแท็ก<script>ใน index.html

วิ่ง

npm install --save @types/jquery

ตอนนี้ฟังก์ชั่น JQuery $ นั้นมีอยู่ในไฟล์. ts ทั้งหมดโดยไม่จำเป็นต้องมีการนำเข้าอื่น ๆ


2
คุณจำเป็นต้องประกาศ jquery / $ ใน Component ของคุณหาก TsLint เปิดอยู่สำหรับการตรวจสอบประเภทประเภทนี้ สำหรับเช่น javascript declare var jquery: any; declare var $: any;
phoenisx

1
@ Subroto ข้อเสนอแนะของคุณทำงานตกลง วางไว้เป็นคำตอบ ขอบคุณ
yW0K5o

21

ฉันเชื่อว่าคุณอาจต้องใช้ตัวพิมพ์ของ typescript สำหรับ JQuery เมื่อคุณพูดว่าคุณกำลังใช้ Visual Studio คุณสามารถใช้ Nuget เพื่อรับมันได้

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

คำสั่งใน Nuget Package Manager Console คือ

Install-Package jquery.TypeScript.DefinitelyTyped

อัปเดต:ตามที่ระบุไว้ในความคิดเห็นแพคเกจนี้ยังไม่ได้รับการอัปเดตตั้งแต่ปี 2016 แต่คุณยังสามารถเยี่ยมชมหน้า Github ได้ที่https://github.com/DefinitelyTyped/DefinitelyTypedและดาวน์โหลดประเภท นำทางโฟลเดอร์สำหรับไลบรารีของคุณแล้วดาวน์โหลดindex.d.tsไฟล์ที่นั่น ปรากฏในที่ใดก็ได้ในไดเรกทอรีโครงการของคุณและ VS ควรใช้ทันที


2
แพ็กเกจ nuget สำหรับ DefinitelyTypes ไม่ได้รับการดูแลรักษาอีกต่อไป คุณจะได้รับรุ่นเก่าถ้าคุณทำเช่นนี้
เดฟเดอ Jong

17

สำหรับเชิงมุม CLI V7

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

ตรวจสอบให้แน่ใจว่า jquery มีรายการใน angular.json -> สคริปต์

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

ไปที่ tsconfig.app.json และเพิ่มรายการใน "ประเภท"

{
    "extends": "../tsconfig.json",
    "compilerOptions": {
        "outDir": "../out-tsc/app",
        "types": ["jquery","bootstrap","signalr"]
    },
    "exclude": [
        "test.ts",
        "**/*.spec.ts"
    ]
}

ไม่มีคุณสมบัติ 'modal' ในประเภท 'JQuery <HTMLElement>' รับข้อผิดพลาดนี้หลังจากเพิ่ม
user2900572

12

อัพเดท 2019:

คำตอบของเดวิดนั้นแม่นยำกว่า

typescript สนับสนุนห้องสมุดผู้จำหน่ายของบุคคลที่ 3 ซึ่งไม่ได้ใช้ typescript สำหรับการพัฒนาห้องสมุดใช้DefinitelyTyped Repo


คุณจำเป็นต้องประกาศjquery/ $ในส่วนประกอบของคุณหากเปิดใช้งาน tsLint สำหรับการตรวจสอบประเภทประเภทนี้

สำหรับเช่น

declare var jquery: any;
declare var $: any;

"ถ้าพวกเขามีการติดตั้งการพิมพ์" ฉันไม่เข้าใจ คุณหมายถึงไม่ได้ติดตั้ง? เหตุใดจึงประกาศว่าพวกเขาเป็นอย่างอื่น? ฉันแค่ต้องการคอมไพล์โดยไม่มีข้อผิดพลาดและไม่ต้องติดตั้งอะไรเพิ่มเติมและฉันทำงานกับ libs ที่ไม่มีประเภทให้ติดตั้ง
redanimalwar

@redanimalwar ฉันคิดว่าฉันเขียนเพราะในเว็บโปรเจ็กต์เช่น reactjs / angular หากกำหนดค่า webpack ด้วยตนเองไลบรารีของบุคคลที่สามจะถูกกำหนดไว้ทั่วโลกและเป็นการยากที่จะบอกว่า webpack ถูกนำเข้าจากที่declareใด แต่ถึงกระนั้นเราสามารถบอก vscode เกี่ยวกับการพิมพ์ถ้ามีอยู่node_modulesนั่นคือสาเหตุที่การติดตั้งการพิมพ์ช่วยในการทำงานได้ดี แต่สำหรับโครงการวานิลลา webpack โดยไม่ต้องมีการถ่ายโอนdeclareคำหลักของโครงการ ฉันลบคำแถลงของฉันออกจากคำตอบเพื่อไม่ให้ผู้อื่นสับสน
phoenisx

ยังไงก็ตามผมยังไม่ได้ fiddled กับเชิงมุม / typescript เป็นเวลานานในขณะนี้ แต่ผมรู้สึกว่าถ้ามีการติดตั้ง typings เราจะได้สิ่งที่ทำเช่นนี้ import JQuery from 'jquery'; declare var $: JQuery;- ไม่แน่ใจว่าจะใช้งานได้หรือไม่
phoenisx

ฉันใช้ - typescriptlang.org/docs/handbook/ใน tsconfig เพื่อระงับปัญหาประเภทบุคคลที่สาม
phoenisx

3

หากคุณต้องการใช้ jQuery ในเว็บแอปพลิเคชั่น (เช่น React) และ jquery นั้นโหลดไปแล้ว <script src="jquery-3.3.1.js"...

บนหน้าเว็บคุณสามารถทำได้:

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

ดังนั้นคุณไม่จำเป็นต้องโหลด jQuery เป็นครั้งที่สอง (พร้อมnpm install --save jquery) แต่มีข้อดีทั้งหมดของ typescript


2

นี่คือขั้นตอนการกำหนดค่าของฉัน TypeScript & jQuery

ทำให้ประเภทของ jQuery สนับสนุนให้ทำงานได้ดีกว่าบทความส่วนใหญ่ในอินเทอร์เน็ตทำงานที่ดีกว่าบทความมากที่สุดในอินเทอร์เน็ต( ฉันเชื่อ. )

ครั้งแรก:

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




วินาที (สำคัญมากมาก!!!):

import jquery = require("jquery");



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




จากนั้นคุณสามารถเพลิดเพลินกับมัน:

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




มันเนียนเรียบ !!!


ดังนั้นต้องเขียนมันในทุกไฟล์ ts ขององค์ประกอบ?
Humble Dolt

@HumbleDolt หากคุณผูก jQuery ใน【หน้าต่าง】คุณเพียงแค่เพิ่มdeclare global { interface Window { $ :JQueryStatic; } }ใน yourTypeDeclaration.d.ts และในการพิจารณาอย่างถูกต้องคุณต้องตรวจสอบว่า $ ติดตั้งใน【 window 】เช่นimport $ = require('jquery'); window.$ = $ ;หรือ jQuery 【 $ 】ของคุณถูกเมาท์ด้วยแท็กสคริปต์ภายนอก
แลนเซอร์. ยัน

คุณหมายถึงสามารถรวมสคริปต์ใน index.html และเขียนว่ามีหรือไม่ typeDeclaration.ts เป็นเหลี่ยม 8? มี tsconfig.json
Humble Dolt

@HumbleDolt import $ = require('jquery') ; window.$ = $;ดังนั้นคุณสามารถลองแก้ปัญหาที่สอง (คุณควรเริ่มต้นสิ่งนี้ในจุดเริ่มต้นโครงการของคุณและฉันต้องการสร้างsdkdir เพื่อจัดการความต้องการด้านนอกของ lib ทั้งหมดและเริ่มต้นในไฟล์หรือสถานที่เดียว)
แลนเซอร์. ยัน

@HumbleDolt 【 yourTypeDeclaretion.d.ts 】เป็นเพียงไฟล์ที่กำหนดประเภท เป็นไฟล์พิเศษที่กำหนดประเภทตนเองของคุณ ใน TypeScript นั้น【 .d.ts 】เป็นเพียงวิธีการแยกอย่างชัดเจนเพื่อแยกความแตกต่างของการจดจำประเภทและรหัสจริง คุณยังสามารถเขียน type-declaration-snipet ในไฟล์【 .ts 】มันจะยังใช้งานได้ (อาจจะมีการแจ้งเตือนการแก้ไขไวยากรณ์)
Lancer.Yan

1

งานนี้สำหรับฉันตอนนี้และวันนี้ที่ Angular เวอร์ชัน 9

  1. ติดตั้งผ่าน npm สิ่งนี้: npm i @ types / jquery เพียงเพิ่ม --save เพื่อตั้งค่าทั่วโลก
  2. ไปที่ tsconfig.app.json และเพิ่ม jquery ในอาร์เรย์ "ประเภท"
  3. ทำหน้าที่และทำ

0

สิ่งนี้ใช้ได้กับฉัน:

export var jQuery: any = window["jQuery"];

1
สิ่งนี้จะใช้งานได้ แต่จะไม่ทำงานตามที่พิมพ์ไว้อย่างแรงซึ่งสูญเสียประโยชน์ในการใช้งานกับ TypeScript หากคุณต้องการใช้ไลบรารีภายนอก ยังค่อนข้างเป็นวิธีที่น่าสนใจ
bnns
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.