[타입선언, @types 46] 타입선언과 버전

2022. 7. 30. 13:59책/이펙티브 타입스크립트

사실 의존성 관리는 매우 힘든 일이다. 아마 대부분은 단순히 라이브러리를 프로젝트에 추가해서 써왔을 뿐, 전이적 의존성이 호환되는지는 깊게 생각해오지 않았을 것이다.

그리고 타입스크립트는 의존성 관리를 복잡하게 만든다. 타입스크립트와 타입, 라이브러리 간 버전이 상호 영향을 미치기 때문이다.



1. 타입 정보 버전 별도 관리

먼저 라이브러리와 타입 정보를 별도로 관리하는 방식을 생각해보자. 보통 타입스크립트에서 의존성을 사용하는 방식이 특정 라이브러리를 dependencies에 설치하고, 타입 정보는 devDependencies에 설치하는 것인데 아래와 같은 문제점이 발생할 수 있다.

  • 라이브러리 버전 > 타입 선언 버전(@types)
    라이브러리는 업데이트했지만 실수로 타입 선언은 업데이트하지 않은 경우. 하위 호환성이 깨지는 등의 오류가 발생할 수 있다.

  • 타입 선언 버전(@types) > 라이브러리 버전
    보통 타입 정보 없이 라이브러리를 써오다가 뒤늦게 타입 선언을 설치할 때 발생한다. 라이브러리 버전을 올리거나 타입 버전을 내려야 한다.

  • 프로젝트 TS 버전 < 라이브러리 TS 버전
    보통 로대시, 리액트, 람다 같은 유명 라이브러리들이 타입 정보를 더 정확하게 표현하려고 TS버전을 올리면서 발생한다

  • @types 의존성 중복 


2. 타입 정보 자체 포함(번들링, .d.ts)
혹은 라이브러리 자체가 타입스크립트로 작성된 경우일 수도 있다. 이 경우 자체적으로 타입 선언을 포함하게 된다(번들링, d.ts) 버전 불일치 문제가 해결되기는 하지만 이 역시도 몇 가지 문제점을 안고 있다.

  • 번들링 된 타입에선 @types의 버전 선택이 불가능하다
    TS 자체 버전이 올라가거나, 보강 기법이 적용 불가능하다면 라이브러리 자체가 안 돌아가는 불상사가 생길 수 있다

  • 프로젝트 내 타입 선언이 타 라이브러리의 타입 선언에 의존하는 경우
    보통 의존성이 devDependecies에 들어가는데, 다른 사용자가 이를 설치할 땐 devDependecies가 설치되지 않으므로 타입 오류가 발생한다

  • 프로젝트의 과거 버전에 있는 타입 선언에 문제가 생겨도 과거 버전으로 돌리기가 어렵다

  • 타입 선언의 패치 업데이트를 자주 하기 어렵다.

3. 공식 권장사항

결국 타입 선언을 라이브러리에 포함하는 것과 별도의 타입 선언 정보를 관리하는 방식 각자가 나름의 장단점을 갖고 있다. 이를 이해하고 사용해야겠지만 일반적인 권장사항은 다음과 같다.

  • 라이브러리가 타입스크립트로 작성된 경우만 타입 선언을 라이브러리에 포함하는 걸 권장
  • 만약 자바스크립트로 작성된 라이브러리라면 손수 작성한 타입 선언은 오류 발생 소지가 많으므로 따로 타입 정보를 관리하는 걸 권장