JSDoc은 TypeScript이다

발행: (2025년 12월 15일 오전 04:42 GMT+9)
6 min read

Source: Hacker News

Overview

2023년 5월, Svelte 레포에서 진행된 내부 리팩터링 PR이 Hacker News 메인 페이지에 올랐습니다. 겉보기에 논란이 된 이 PR은 TypeScript 회의론자 / 루디트(당시 React 팀의 Dan Abramov 같은 인물들을 포함하고 있었습니다. 정적 타입을 거부하는 것으로 알려진 웹 프레임워크의 대표 주자가 이런 주목을 받게 된 것은 큰 사건이었습니다. Rich Harris는 HN에서 (링크) .ts 파일에서 .js 파일의 JSDoc 주석으로 옮긴 것이 반‑TypeScript 입장을 입증한 것이 아니다라고 설명했습니다.

Harris는 Svelte의 “TypeScript에 대한 헌신은 그 어느 때보다 강력하다”고 주장했으며, 이는 “TypeScript vs JSDoc” 논쟁을 촉발시켰고, JSDoc이 “빌드 단계 없이 TypeScript의 모든 장점을 제공한다”는 주장이 이어졌습니다(다소 어색한 문법을 동반하지만).

그런 틀 대신에 저는 더 미묘한 대체를 제안합니다: JSDoc TypeScript이다.

Some background

TypeScript is C#?

(No, but it explains much of TS’s early development)

2000년대 후반 / 2010년대 초반에 JavaScript는 종종 진지하지 않게 여겨졌습니다. 자동 완성, 심볼 이름 바꾸기, 타입 안전성 등 도구가 부족했죠. Microsoft 개발자들은 C# 코드를 작성하고 ScriptSharp라는 도구를 사용해 약간 더 타입‑안전한 JavaScript를 생성했습니다. 이것이 TypeScript의 기원입니다.1 근본적으로 TypeScript는 JS 작성을 덜 오류가 나게 만들기 위한 빌드 도구로 시작되었습니다.

TypeScript is IntelliSense!

.ts 파일을 작성하지 않더라도, 여러분은 아마 TypeScript를 사용하고 있을 겁니다. 왜냐하면 IntelliSense 엔진을 구동하기 때문이죠. 편집기가 코드 완성, 매개변수 정보, 퀵 정보, 멤버 리스트 등을 제공한다면, 거의 확실히 TypeScript 언어 서비스를 실행하고 있는 것입니다.

TypeScript is JSDoc :)

같은 TypeScript 언어 서비스가 JSDoc 주석을 해석합니다. 그래서 TypeScript CHANGELOG에 종종 JSDoc 기능에 관한 노트​가 포함됩니다.2 이는 JSDoc‑관련 IntelliSense가 tsconfig.json 파일에 의해 제어될 수 있고, JSDoc 주석으로 타입을 지정한 프로젝트에 tsc를 실행할 수 있는 이유를 설명합니다. 요컨대, 여러분은 이미 TypeScript를 사용하고 있는 것입니다.

My Own Experience

저는 최근 오래된 프로젝트의 프론트‑엔드를 전면 재작성하면서 모든 코드를 JSDoc 주석으로 타입을 지정했습니다. 몇 가지 깨달음은 다음과 같습니다:

  • 런타임 기능인 enum을 제외하고는, JSDoc을 통해 TypeScript의 거의 모든 기능을 표현할 수 있습니다. 일부 기능(예: 제네릭)은 다소 어색하게 보일 수 있는데, 제네릭 슬롯을 추론하기 위해 반환 타입을 명시해야 할 때가 있습니다. 때때로 이런 추가적인 장황함이 타입 추론을 유도해 더 나은 관행을 장려하기도 합니다.
  • JSDoc으로 타입이 지정된 패키지에서는 Ctrl/Cmd‑클릭으로 함수 정의가 별도의 선언 파일이 아니라 실제 구현으로 바로 이동합니다—제가 훨씬 선호하는 워크플로우입니다.
  • TypeScript 도구는 JSDoc 프로젝트에서도 놀라울 정도로 잘 작동합니다. 여기에는 스키마(OpenAPI 또는 GraphQL)를 소비하고 TypeScript 코드 대신 JSDoc 주석을 내보내는 타입‑생성 라이브러리도 포함됩니다.

자칭 TypeScript 매니아인 저의 말에 귀 기울여 주세요: JSDoc은 반‑TypeScript 입장이 아니라, 별도의 빌드 단계 없이 동일한 강력한 정적 분석을 제공하는 방법입니다.

  • enum이 언어에 아쉽게1 추가된 이유이기도 합니다.
  • 한 가지 안타까운 부가 설명: TypeScript 전문가가 된다는 것은 문서의 절반이 changelog에 살아 있다는 것을 받아들여야 함을 의미합니다. 예를 들어, unique symbol에 관한 항목을 보세요.2

Footnotes

  1. TypeScript 기원에 관한 원본 논의를 참고하세요. 2

  2. JSDoc import tag에 대한 자세한 내용은 TypeScript 5.5 릴리즈 노트를 확인하세요. 2

Back to Blog

관련 글

더 보기 »

JavaScript 101: 제어 흐름 시작하기

TL;DR - 애플리케이션에서 control flow는 코드가 올바른 경로를 따라 실행되도록 담당합니다. if, else if, else는 서로 다른 흐름을 실행하도록 도와줍니다.