이펙티브 타입스크립트 (댄 밴더캄 지음) 를 읽고 정리
📍요약
✅필수가 아닌 의존성을 분리할 때는 구조적 타이핑을 사용하면 됩니다
✅공개한 라이브러리를 사용하는 자바스크립트 사용자가 @types 의존성을 갖지 않게 해야 합니다.
그리고 Node.js를 사용하지 않는 개발자(TypeScript 사용자)가 Node.js 관련된 의존성을 갖지 않게 해야 합니다.
📍CSV 파일을 파싱하는 라이브러리를 만들고 있다고 가정하면..
로컬 시스템의 csv 파일을 읽기 위해 Buffer 타입이 필요하다
Buffet 타입은 @types/node 에 정의되어 있으므로 해당 타입 선언을 라이브러리에 포함하게 된다
// @types/node 설치 필요
function parseCSV(contents: string | Buffer): {[column: string]: string}[] {
if (typeof contents === 'object') {
// It's a buffer
return parseCSV(contents.toString('utf8'));
}
// COMPRESS
return [];
// END
}
그런데, @types/node를 설치해야 한다면.. 두 그룹의 유저에게 문제가 생긴다
- TypeScript 비사용자 : JavaScript만 사용하므로 @types/node 를 설치할 필요가 없음!
- TypeScript 사용자 : Node.js 를 사용하지 않으므로 @types/node 를 설치할 필요가 없음!
📍구조적 타이핑으로 모듈 설치 대신 직접 타입 선언 : 미러링
Buffer 사용 대신 직접 필요한 부분만 명시하여 사용 => Buffer 완벽 지원
interface CsvBuffer {
// Buffer를 사용하지 않고 직접 구현한 메서드
toString(encoding: string): string;
}
function parseCSV(contents: string | CsvBuffer): {[column: string]: string}[] {
// COMPRESS
return [];
// END
}
이를 미러링(mirroring) 이라고 한다
✅미러링 : 라이브러리를 작성할 때,타입 (예 - @types/node) 만 필요하다면,
직접 설치하지 않고 필요한 선언부만 추출 및 구현하여 작성중인 라이브러리에 넣는 것
다른 라이브러리의 타입 선언 대부분을 사용해야 한다면, 미러링 대신 그냥 명시하여 사용하는 것이 낫다