본문으로 건너뛰기

이펙티브 타입스크립트

📄️ 아이템 10 객체 래퍼 타입 피하기

charAt 은 string 의 메서드가 아니며, string 을 사용할 때 자바스크립트 내부적으로 많은 동작이 일어난다. string ‘기본형’에는 메서드가 없지만, 자바스크립트에는 메서드를 가지는 String ‘객체’ 타입이 정의되어 있다. 자바스크립트는 기본형과 객체 타입을 서로 자유롭게 변환한다. string 기본형에 charAt 같은 메서드를 사용할 때, 자바스크립트는 기본형을 String 객체로 래핑(wrap)하고, 메서드를 호출하고, 마지막에 래핑한 객체를 버린다.

📄️ 아이템 16 number 인덱스 시그니처보다는 Array, 튜플, ArrayLike 를 사용하기

인덱스 시그니처가 number 로 표현되어 있다면 입력한 값이 number 여야 한다는 것을 의미하지만, 실제 런타임에 사용되는 키는 string 타입이다. 일반적으로 string 대신 number 를 타입의 인덱스 시그니처로 사용할 이유는 많지 않다. 숫자를 사용하여 인덱스할 항목을 지정한다면 Array 또는 튜플 타입을 대신 사용하게 될 것이다. number 를 인덱스 타입으로 사용하면 숫자 속성이 어떤 특별한 의미를 지닌다는 오해를 불러 일으킬 수 있다.

📄️ 아이템 40 함수 안으로 타입 단언문 감추기

함수의 모든 부분을 안전한 타입으로 구현하는 것이 이상적이지만, 불필요한 예외 상황까지 고려해 가며 타입 정보를 힘들게 구성할 필요는 없다. 함수 내부에는 타입 단언을 사용하고 함수 외부로 드러나는 타입 정의를 정확히 명시하는 정도로 끝내는 게 낫다. 프로젝트 전반에 위험한 타입 단언문이 드러나 있는 것보다, 제대로 타입이 정의된 함수 안으로 타입 단언문을 감추는 것이 더 좋은 설계이다.

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

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

📄️ 아이템 61 의존성 관계에 따라 모듈 단위로 전환하기

점진적 마이그레이션을 할 때는 모듈 단위로 하는 것이 이상적이다. 그런데 한 모듈을 골라서 타입 정보를 추가하면 해당 모듈이 의존(임포트)하는 모듈에서 비롯되는 타입 오류가 발생하게 된다. 의존성과 관련된 오류없이 작업하려면, 다른 모듈에 의존하지 않는 최하단 모듈부터 작업을 시작해서 의존성의 최상단에 있는 모듈을 마지막으로 완성해야 한다.