icon안동민 개발노트

DefinitelyTyped와 @types


 DefinitelyTyped는 TypeScript의 타입 정의 파일을 위한 대규모 오픈 소스 저장소입니다.

 @types는 이 정의 파일들을 npm 패키지로 제공하는 시스템입니다.

DefinitelyTyped 프로젝트

 목적

  • JavaScript 라이브러리에 대한 TypeScript 타입 정의 제공
  • 커뮤니티 주도의 타입 정의 개발 및 유지보수

 역사

  • 2012년 시작
  • TypeScript의 채택 증가와 함께 급속히 성장

 중요성

  • TypeScript 생태계의 핵심 인프라
  • 수천 개의 라이브러리에 대한 타입 지원
  • 개발자 생산성 및 코드 품질 향상

@types 패키지

 개념

  • npm을 통해 배포되는 타입 정의 패키지
  • @types/ 접두사로 구분

 npm 통합

  • 자동 타입 설치 지원 (TypeScript 2.0 이후)
  • 원본 라이브러리와 동일한 이름 사용 (예 : @types/lodash)

@types 패키지 사용법

 설치

npm install --save-dev @types/lodash

 사용

import * as _ from 'lodash';
 
const result = _.chunk([1, 2, 3, 4, 5], 2);
console.log(result); // [[1, 2], [3, 4], [5]]

 통합 과정

  1. 라이브러리 설치 (npm install lodash)
  2. 타입 정의 설치 (npm install --save-dev @types/lodash)
  3. TypeScript 설정 확인 (tsconfig.jsontypeRootstypes)
  4. 코드에서 import 및 사용

DefinitelyTyped 기여 방법

  1. 저장소 포크 및 클론
  2. 새 브랜치 생성
  3. 타입 정의 작성 또는 수정
  4. 테스트 추가 또는 업데이트
  5. Pull Request 제출

 예시 (새 라이브러리 추가)

// index.d.ts
declare module 'my-library' {
    export function myFunction(input: string): number;
}
 
// my-library-tests.ts
import { myFunction } from 'my-library';
 
const result = myFunction('test');

버전 관리 전략

  • 원본 라이브러리 버전과 일치
  • 주요 버전은 라이브러리 변경 반영
  • 부 버전은 타입 정의 개선에 사용

 동기화 방법

  • 정기적인 업데이트 확인
  • 커뮤니티 기여를 통한 지속적 개선

품질 보증 프로세스

  • 자동화된 CI/CD 파이프라인
  • dtslint를 사용한 린팅
  • 테스트 파일 필수 (예 : my-library-tests.ts)
  • 커뮤니티 리뷰 및 피드백

충돌 해결 및 우선순위

 자체 타입 정의와 @types 충돌 시

  1. tsconfig.json에서 특정 @types 제외
tsconfig.json
{
  "compilerOptions": {
    "types": ["node", "jest"]
  }
}
  1. 타입 정의 파일 직접 수정 (비권장)
  2. 타입 선언 병합 사용

 우선순위

  1. 프로젝트 내 로컬 선언
  2. 설치된 @types 패키지
  3. 컴파일러 기본 제공 타입

누락된 라이브러리 대응

  1. 임시 로컬 선언 파일 작성
// my-lib.d.ts
declare module 'my-lib' {
   export function someFunction(): void;
}
  1. DefinitelyTyped에 기여 고려
  2. 라이브러리 개발자에게 타입 지원 요청

일반적인 문제와 해결

 1. 버전 불일치

npm install --save-dev @types/[email protected]

 2. 타입 오류

// 오류
import { someFunction } from 'my-lib';
 
// 해결
import * as myLib from 'my-lib';
myLib.someFunction();

 3. 중복 선언

  • tsconfig.json에서 "skipLibCheck": true 설정

Best Practices

  1. 정기적인 타입 정의 업데이트
  2. 프로젝트에 맞는 타입 버전 고정
  3. 커뮤니티 기여 장려
  4. 자체 타입 정의 최소화
  5. TypeScript 컴파일러 설정 최적화

 대규모 프로젝트 관리 전략

  1. 중앙화된 타입 관리 팀 구성
  2. 타입 정의 품질 모니터링 시스템 구축
  3. 자동화된 타입 업데이트 프로세스
  4. 커스텀 타입과 @types 통합 가이드라인 수립
  5. 정기적인 타입 감사 및 정리

 DefinitelyTyped와 @types 시스템은 TypeScript 생태계의 근간을 이루는 중요한 요소입니다.

 이들은 개발자들에게 타입 안정성과 자동 완성 같은 강력한 도구를 제공합니다.

 이 시스템의 성공은 크게 두 가지 요인에 기인합니다.

 첫째, 오픈 소스 커뮤니티의 활발한 참여로 지속적인 업데이트와 품질 개선이 이루어집니다.

 둘째, npm과의 긴밀한 통합으로 사용자 경험이 크게 향상되었습니다.