📎아이템 51 의존성 분리를 위해 미러 타입 사용하기

라이브러리를 공개하면 타입 선언도 포함하게 된다. 타입 선언이 @types/node에 의존하면 @types/nodedevDependencies도 포함해야 한다. 그러나 @types/nodedevDependencies로 포함하면 다음 두 그룹의 라이브러리 사용자들에게 문제가 생긴다.

1️⃣ @types와 무관한 자바스크립트 개발자

2️⃣ NodeJS와 무관한 타입스크립트 웹 개발자

두 그룹의 사용자들은 각자가 사용하지 않는 모듈이 포함되어 있어 혼란스러울 수 있다.

⭐️ 각자가 필요한 모듈만 사용할 수 있도록 구조적 타이핑을 적용하자.

@types/node에 있는 선언을 사용하지 않고, 필요한 메서드와 속성만 별도로 작성할 수 있다. 인터페이스를 별도로 만들어 사용하면 된다.

만약, 작성 중인 라이브러리가 의존하는 라이브러리의 구현과 무관하게 타입에만 의존한다면, 필요한 선언부만 추출하여 작성 중인 라이브러리에 넣는 것(미러링)을 고려해보는 것이 좋다. NodeJS 기반 타입스크립트 사용자에게는 변화가 없지만, 웹 기반이나 자바스크립트 등 다른 모든 사용자에게는 더 나은 사양을 제공할 수 있다.

다른 라이브러리의 타입이 아닌 구현에 의존하는 경우에도 동일한 기법을 적용할 수 있고, 타입 의존성을 피할 수 있다. 그러나 프로젝트의 의존성이 다양해지고, 필수 의존성이 추가됨에 따라 미러링 기법을 적용하기 어려울 수 있다. 다른 라이브러리의 타입 선언의 대부분을 추출해야 한다면, 차라리 명시적으로 @types 의존성을 추가하는게 낫다.

미러링 기법은 유닛 테스트톼 상용 시스템 간의 의존성을 분리하는 데도 유용하다.

📍 요약

  • 필수가 아닌 의존성을 분리할 때는 구조적 타이핑을 사용하자.

  • 공개한 라이브러리는 자바스크립트 개발자가 사용할 수 있으므로 @types 의존성을 가지지 않도록 해야 한다.

  • 공개한 라이브러리는 웹 개발자가 사용할 수 있으므로 NodeJS 관련된 의존성을 가지지 않게 해야 한다.

Last updated