이펙티브 타입스크립트 (1)

남자김용준·2021년 11월 3일
0

아이템1 . 타입스크립트와 자바스크립의 관계 이해

타입스크립트는 자바스크립트의 슈퍼셋

모든 자바스크립트는 타입스크립트 프로그램이다. 반대로 타입스크립트는 별도의 문법을 가지고 있기 때문에 유효한 자바스크립트 프로그램은 아니다.

타입스크립트는 자바스크립트 런타임 동작을 모델링하는 타입 시스템을 가지고 있어 런타임 오류를 발생시키는 코드를 찾아내려한다.

자바스크립트에서는 런타임에서나 찾을 수 있는 문제를 타입스크립트는 코드를 작성하거나 컴파일 단계에서 찾아낸다. 하지만 모든 문제를 찾아내는 것은 아니다.

잘못된 매개변수 개수로 함수를 호출하는 경우처럼, 자바스크립트에서는 허용되지만 타입스크립트에서는 문제가 되는 경우도 있다.

아이템2. 타입스크립트 설정 이해하기

타입스크립트 설정은 커맨드 라인을 이용하기보다는 tsconfig.json을 사용하는 것이 좋다.

자바스크립트에서 타입스크립트로 마이그레이션하는 게 아니라면 noImplicitAny를 설정하는 게 좋다.

noImplicitAny는 변수들이 미리 정의된 타입을 가져야 하는 지 여부를 제어한다. any는 유용하지만 매우 주의해야하기 때문에 되도록이면 사용하지 않는 게 좋다.

strictNullCheck를 설정하여 undefined는 객체가 아닙니다. 같은 런타임 오류를 방지하자

strictNullCheck는 null과 undefined가 모든 타입에서 허용되는 지 확인하는 설정이다. 이는 null과 undefined 관련된 오류를 잡아 내는 데 많은 도움이 된다.

타입스크립트에서 엄격한 체크를 하고 싶다면 strict 설정을 고려하자.

아이템3. 코드 생성과 타입이 관계없음을 이해하기

타입스크립트 컴파일러는 구버전의 자바스크립트로 트랜스파일링하는 작업과 코드의 타입 오류를 체크한다. 이 두 가지는 완벽히 독립적이다.

따라서 타입 오류가 있는 코드도 컴파일이 가능하다.

런타임에는 타입 체크가 불가능하다.

런타임 타입은 선언된 타입과 다를 수 있다.

API를 잘못 파악해서 생기는 문제같은 경우

타입스크립트 타입으로는 함수를 오버로드할 수 없다.

아이템4. 구조적 타이핑에 익숙해지기

자바스크립트가 덕 타이핑 기반이고 타입스크립트가 이를 모델링하기 위해 구조적 타이핑을 사용함을 이해해야 한다. 어떤 인터페이스에 할당 가능한 값이라면 타입 선언에 명시적으로 나열된 속성들을 가지고 있다.

클래스 역시 구조적 타이핑 규칙을 따른다는 것을 명심해야 한다.

구조적 타이핑을 사용하면 유닛 테스팅을 손쉽게 할 수 있다.

=> 아이템4는 다시 읽어보기.

아이템5. any 타입 지양하기

any 타입에는 타입 안정성이 없다.

any를 사용하면 선언된 타입 외에 다른 타입도 할당할 수 있게 된다.

any는 함수 시그니처를 무시한다.

함수를 작성할 때는 시그니처를 명시해야 한다. 호출하는 쪽은 약속된 타입의 입력을 제공하고, 함수는 약속된 타입의 출력을 반환한다. 하지만 any 타입을 사용하면 이런 약속을 어길 수 있게 된다.

any 타입에는 언어 서비스가 적용되지 않는다.

어떤 심벌에 타입이 있으면 타입스크립트 언어 서비스는 자동완성 기능과 적절한 도움말을 제공한다. 그러나 any 타입인 경우에는 아무런 도움도 받을 수 없다.

any 타입은 코드 리펙터링 때 버그를 감춘다.

any는 타입 설계를 감춘다.

타입스크립트에서 제대로 된 타입 설계는 필수이다. 하지만 any타입을 사용하면 타입 설계가 불분명해진다. 설계가 잘 되었는지 설계가 어떻게 되어 있는지 전혀 알 수 없다.

any는 타입시스템의 신뢰도를 떨어뜨린다.

타입스크립트를 사용하면 타입 체커가 실수를 잡아주고 코드의 신뢰도가 높아진다. 그러나 런타임에 타입 오류를 발견하게 된다면 타입 체커를 신뢰할 수 없다. any 타입을 쓰지 않으면 런타임에 발견될 오류를 미리 잡을 수 있고 신뢰도를 높일 수 있다.

profile
frontend-react

0개의 댓글