강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

oklshop555님의 프로필 이미지
oklshop555

작성한 질문수

[리뉴얼] 타입스크립트 올인원 : Part2. 실전 분석편

jQuery 타입 직접 만들어보기

jQuery를 $로 한 번 더 감싼 형태

작성

·

26

0

안녕하세요, 제로초님! 좋은 강의 잘 듣고있습니다.

아래 $(tag)의 타입 추론 과정에 대해 질문드립니다.

// tag: JQuery<HTMLElement>
const tag = $("ul li")
  .addClass("hello")
  .addClass(function (index) {
    return "item-" + index;
  });

//* jQuery를 $로 한번더 감싼 형태
$(tag).html(function (i: number) {
  console.log(this);
  return 

JQuery와 $의 타입 정의는 다음과 같습니다.

// JQuery
interface JQuery<TElement = HTMLElement> extends Iterable<TElement> {...}
// $
<T extends Element>(element_elementArray: T | ArrayLike<T>): JQuery<T>;

즉, $(tag)의 tag는 JQuery<HTMLElement>이면서 element_element에 대응하므로 Element | ArrayLike<Element>이기도 합니다. 즉 JQuery<HTMLElement>Element | ArrayLike<Element>가 되기에 충분하다는 것을 추론할 수 있습니다.

JQuery<HTMLElement> extends Iterable<HTMLElement> 이므로 Iterable<HTMLElement> Element | ArrayLike<Element> 가 되기에 충분하다는 건데, 이 근거를 찾기 위해 Iterable의 타입도 찾아본 결과 다음과 같았습니다.

interface Iterable<T> {}

Iterable<HTMLElement>non-nullish라는 것입니다.

하지만 이게 Element | ArrayLike<Element> 가 되기에 왜 충분한 것인지를 모르겠습니다. lib.dom.d.ts에 정의된 Element 타입은 다음과 같이 매우 복잡하여 더 들여다 보진 못했습니다.

interface Element extends Node, ARIAMixin, Animatable, ChildNode, NonDocumentTypeChildNode, ParentNode, Slottable {


답변 1

1

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

$에 해당하는 타입은

<T>(selection: JQuery<T>): JQuery<T>;

이겁니다. 그래서 그냥 JQuery가 $(tag)처럼 들어갈 수 있는 것입니다.

oklshop555님의 프로필 이미지
oklshop555
질문자

아 아랫줄에 저렇게 함수 오버로드가 되어 있었군요 ㅠㅠ

제가 미처 못봤네요 감사합니다~

oklshop555님의 프로필 이미지
oklshop555

작성한 질문수

질문하기