Typescript

jQuery 타입 분석하기

비숑주인 2025. 5. 10. 23:14

Query는 점차 사용이 줄어들고 있지만 여전히 레거시 코드나 간단한 DOM 조작 등에서 자주 볼 수 있는 라이브러리다. 이번 글에서는 jQuery 라이브러리의 타입 선언 파일을 직접 분석하면서, 타입스크립트의 강력한 타입 시스템이 어떻게 외부 라이브러리를 설명하고 지원하는지를 배워보자. 

 

jQuery와 타입 선언 설치

$ npm i jquery@3.6.3 @types/jquery@3.5.16

 

  • jquery: 실제 구현 코드
  • @types/jquery: 타입 선언 파일 (.d.ts)

jQuery는 자체적으로 타입스크립트를 지원하지 않기 때문에 @types/jquery 패키지를 추가로 설치해야 한다.

타입 선언 파일 진입점 확인

node_modules/@types/jquery/package.json에 다음이 명시되어 있다:

 

"types": "index.d.ts"

 

따라서 index.d.ts 파일이 타입 선언의 진입점(entry point) 이다. 

/// <reference path="JQueryStatic.d.ts" />
/// <reference path="JQuery.d.ts" /> ...

 

  • 각 파일은 jQuery의 주요 타입 인터페이스들 ($, jQuery, 인스턴스 메서드 등)을 정의한다.
  • export = jQuery는 CommonJS 형식의 기본 내보내기를 의미하며 import $ = require("jquery") 식으로 사용할 수 있게 한다. 

$ 함수 분석

$("p").removeClass("myClass noClass").addClass("yourClass");

 

$의 정의 위치

declare const $: JQueryStatic;

 

JQueryStatic 인터페이스 내부 오버로딩 예시

<TElement extends HTMLElement = HTMLElement>(
  selector: JQuery.Selector, context?: Element | Document | JQuery
): JQuery<TElement>;

 

  • $는 여러 오버로딩 중 적절한 것을 자동 선택한다. 
  • "p"는 JQuery.Selector → type Selector = string → string 타입으로 매칭.

JQuery<TElement> 타입과 메서드 체이닝

.removeClass("myClass noClass")
.addClass("yourClass")
 
  • JQuery<T>는 jQuery 인스턴스 타입이다.
  • 메서드들의 반환 타입은 모두 this → 체이닝 가능.

예:

interface JQuery<TElement> {
  removeClass(name?: string | string[]): this;
  addClass(name: string | string[]): this;
}

 

  • 타입 별칭 JQuery.TypeOrArray<T> = T | T[] 덕분에 "class1 class2"나 ["class1", "class2"] 모두 허용된다.

선택자 배열 처리

$(["p", "t"]).text("hello");

 

문자열 배열도 $의 오버로딩 중 하나에 대응된다.

<T>(element_elementArray: T | ArrayLike<T>): JQuery<T>;

 

  • ["p", "t"]는 ArrayLike<string>으로 취급 가능.
  • .text("hello")는 string | number | boolean | ((...) => string | number | boolean)을 받음.

콜백 함수 타입

const tag = $("ul li").addClass((index) => `item-${index}`);

 

addClass는 다음과 같은 오버로딩을 포함:

addClass(fn: (this: TElement, index: number, className: string) => string): this;

 

  • 콜백에서 this는 TElement (여기서는 HTMLElement).

$(this)와 html 메서드

$(tag).html(function(i: number) {
  return $(this).data('name') + '입니다';
});

 

 

  • this는 HTMLElement → $의 element_elementArray 오버로딩에 대응.
  • html 메서드는 다음 형태를 가짐:
html(fn: (this: TElement, index: number, oldHtml: string) => string): this;

 

 

  • data(key: string): any이므로 any + string은 string이 되어 html의 반환값 타입인 JQuery.htmlString에 적합.

타입 별칭과 네임스페이스의 역할

namespace JQuery {
  type htmlString = string;
}

 

  • 단순한 string이지만 의미를 명확히 하려고 별칭과 네임스페이스를 사용.
  • 같은 이름의 타입이 다른 라이브러리에 있을 경우 충돌을 방지.

정리: 타입 선언 분석 흐름

분석 순서 확인 위치
$ 정의 misc.d.ts → JQueryStatic
오버로딩 선택 JQueryStatic.d.ts
htmlString 정의 JQuery.htmlString = string
반환 타입 추적 JQuery<TElement>
메서드 확인 JQuery.d.ts 내 개별 메서드들
this 처리 각 콜백 함수 내의 this 타입
배열/Element 처리 element_elementArray 오버로딩 사용
 
  • 외부 타입 선언(.d.ts) 파일 구조 이해
  • 오버로딩 기반 타입 추론 흐름 따라가기
  • this, T, 제네릭, 네임스페이스의 활용
  • 타입스크립트가 어떻게 jQuery의 API 사용을 타입 수준에서 보장하는지 확인