본문 바로가기

programming study/TypeScript

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

본 내용은 댄 밴더캄, 『이펙티브 타입스크립트』, 장원호 옮김, 프로그래밍인사이트를 토대로 작성하였습니다.

1. 타입스크립트는 자바스크립트의 상위 집합

  • 자바스크립트의 문법은 타입스크립트에 포함이 됨
    • 타입스크립트만의 독자적인 문법이 있음(타입 체크 문법)
    • 일부 자바스크립트만 타입 체크를 통과
  • 호환성이 높아, 자바스크립트에서 타입스크립트의 마이그레이션에 엄청난 이점이 됨
    • 단, 타입스크립트 설정을 느슨하게 시작해야 함(strct를 false)
  • 타입스크립트 컴파일러는 자바스크립트를 포함하여 유용
    • 타입추론으로 런타임 오류 방지
  • 단, 타입스크립트가 모든 오류를 찾아낼 수는 없음

2. 타입스크립트 설정

  • 타입스크립트 컴파일러에는 다양한 설정을 적용할 수 있음
  • nolmplicitAny, strictNullChecks는 필수적으로 설정하는 것을 권장
    • nolmplicitAny: any를 허용하지 않음
    • strictNullChecks: null, undefined를 허용하지 않음
    • strict 설정을 함으로써, 엄격한 타입스크립트 컴파일러 설정을 할 수 있음

3. 코드 생성 / 타입

  • 타입스크립트 컴파일러의 역할
    • 엄밀히는 트랜스파일러(고수준언어를 다른 고수준어로로 바꾸는 것이므로)
    • 구버전의 자바스크립트로 트랜스파일
    • 코드의 타입 오류 체크
  • 타입 오류가 있어도 컴파일은 가능
    • 타입스크립트 오류는 경고 수준으로 빌드를 멈추지는 않음
    • noEmitOnError를 설정하면, 오류 발생시 빌드를 정지
  • 런타임 타입 체크는 불가능
    • 자바스크립트로 트랜스파일 되며, 타입스크립트의 인터페이스, 타입 등은 제거됨(트리쉐이킹)
    • 런타임 타입 체크를 위한 기법들이 있음
  • API 호출 후 응답으로 받아온 값으로 함수를 실행하는 경우, 타입 체크가 보장되지 않음
  • 타입으로 함수를 오버로드 불가능
    • 런타임 동작과 무관하기 때문
  • 트리쉐이킹으로 인해 런타임 성능에 영향을 주지 않음

4. 타입스크립트는 덕 타이핑 기반

  • 덕 타이핑 : 객체가 어떤 타입에 부합하는 변수와 메서드를 가지면 객체를 해당 타입에 속하는 것으로 간주하는 것
    • 자바스크립트는 덕 타이핑 기반
    • 타입스크립트는 자바스크립트의 런타임 동작을 모델링함
  • 서로다른 인터페이스 A, B가 있을 때 B의 모든 속성이 A에 있으면 A는 B에 호환이 됨
    • 구조적 타이핑
  • 구조적 타이핑이 문제를 일으킬 수도 있음
    • 호환되는 인터페이스로 인해 호출되는 매개변수들의 타입이 선언된 속성을 가지지 않는 경우 발생
    • 타입스크립트의 타입은 열린 타입 cf.닫힌 타입
    • ex) 루프문, 클래스 할당문
  • 덕타이핑은 테스트 작성시 유리

5. any 지양

  • any는 타입스크립트를 무력하게 함
  • IDE의 자동완성 기능을 활용할 수 없음
  • 사용을 피할 것

느낀점

아이템 2에서 타입스크립트 strict 설정의 중요성이 언급되었는데, 대단히 공감하였다. 근무하고 있는 회사의 메인 소스코드가 4할정도가 타입스크립트 나머지가 자바스크립트를 이루어져있다. 문제는 nolmplicitAny가 false로 되어있는 것이다... 이로인해 타입스크립트로 되어있는 소스코드에도 any가 남발되어 사용안하느니 못한 상황이다. 과격하게 말하자면 nolmplicitAny를 false로 줄 것이면 그냥 타입스크립트를 쓰지 않는게 낫다.

아이템 4에서 구조적 타이핑에 의한 문제 발생 예시가 인상적이었다. 루프문을 실행할 때 타입을 정의한 객체를 순회하여도 객체는 정확한 타입으로 접근하기 어렵다. 이 사실이 잘 이해는 되지 않았지만 객체에는 여러가지 타입의 value를 넣을 수 있으므로 순회중에 어떤 타입일 지 확정짓기가 어렵다는 것으로 파악하였다.

본문에서는 저자가 타입스크립트 컴파일러라고 언급하였는데, 엄밀히는 트랜스파일러가 맞다고 생각한다. 왜냐하면 컴파일러는 다른 프로그래밍 언어로 번역하는 역할을 하는데 타입스크립트는 그렇지는 않기 때문이다. 타입스크립트, 최신 문법 자바스크립트를 구버전 자바스크립트로 트랜스파일하므로 트랜스파일러가 더 정확한 표현인 것 같다.

더해서, 자바스크립트와 타입스크립트의 문법의 엄격함은 취향의 차이라고 언급되어있는데 개인적인 경험상 이것에 반대하고 싶다. 현재 현업에서 근무를하며 마주쳤던 문제들의 대부분은 자바스크립트의 암묵적 타입변환에서 일어났기 때문이다. 안정적인 서비스를 소비자에게 제공한다는 입장에서, 타입스크립트의 엄격한 문법은 자바스크립트의 느슨한 문법에 절대적 우의를 가진다고 강력하게 주장하고 싶다.