오늘은 상당히 바쁜 하루였다. 그래서 이펙티브 타입스크립트에서 공부한 부분을 간단하게 정리하려 한다. 왔다 갔다 하면서 보고 있어서 빼먹는 부분을 오늘 간단히 정리하겠다.
타입스크립트는 설정하는 거에 따라서 완전 다른 언어가 될 수 있다. 컴파일을 할 때 설정을 하면서 컴파일해줄 수 있다. 근데 그것보다 설정 파일을 사용하는 것이 좋다고 한다. 타입스크립트 설정들은 어디서 소스 파일을 찾을지, 어떤 종류의 출력을 생성할지 제어하는 내용이 대부분이다. 그런데 언어 자체의 핵심 요소들을 제어하는 설정도 있다. 이러한 설정을 제대로 사용하려면, noImplicityAny와 strictNullChecks를 이해해야 한다. noImplicityAny는 변수들이 미리 정의된 타입을 가져야 하는지 여부를 제어한다. 타입스크립트는 타입 정보를 가질 때 가장 효과적이기 때문에, 되도록이면 noImplictyAny를 설정해야 한다. 다음으로 strictNullChecks는 null과 undefined가 모든 타입에서 허용되는지 확인하는 설정이다. 이름처럼 특정 타입에 null값을 할당하지 못하게 한다. undefined도 못하게 막는다. 굳이 하려면 union타입을 사용해서 만들어 주면 된다. 위의 두 설정 말고 다른 게 많지만 그건 차차 알아봐야겠다. 그리고 위의 2개를 처음 설정하면 코드 작성할 때 힘든 부분이 있지만 빨리 익숙해져야 프로젝트 생산성에 훨씬 좋다고 한다.
다음으로는 타입스크립트 컴파일러가 수행하는 역할을 살펴보면서 코드 생성과의 관계를 알아보자. 컴파일러는 두 가지 역할을 한다고 한다.
- 최신 타입스크립트/자바스크립트를 브라우저에서 동작할 수 있도록 구버전의 자바스크립트로 트랜스파일한다.
- 코드의 타입 오류를 체크한다.
여기서 이 두 가지가 완벽히 독립적으로 작동한다. 몇 가지 특징들을 살펴보면서 정리해 보자.
타입스크립트는 타입 오류가 있는 코드도 컴파일이 가능하다. 타입 체크와 컴파일이 동시에 이루어지는 C나 자바 같은 언어와 다르게 타입스크립트의 오류는 일종의 warning과 같다. 문제가 될 만한 부분을 알려 주지만, 빌드를 멈추지는 않는다. 책에서 컴파일과 타입 체크에 대해 간단한 구분을 해줬는데, 코드에 오류가 있을 때 '컴파일에 문제가 있다'라고 말하는데 이는 기술적으로 틀린 말이라고 한다. 엄밀히 말하면 오직 코드 생성만이 '컴파일'이라고 할 수 있기 때문이다. 따라서 코드에 오류가 있을 때 '타입 체크에 문제가 있다'라고 말하는 것이 더 정확한 표현이다.
그래서 여기서 예시에서 보면 그냥 명령어로 cat을 통해 ts코드를 볼 수가 있으니 컴파일은 문제없다고 보는 거 같다.
다음 특징은 런타임에는 타입 체크가 불가능하다는 것이다. 실제로 자바스크립트로 컴파일되는 과정에서 모든 인터페이스, 타입, 타입 구문은 그냥 제거되어 버린다. 다음 코드를 보자.
instanceof 체크는 런타임에 일어나지만, Rectangle은 타입이기 때문에 런타임 시점에 아무런 역할을 할 수 없다. 이렇게 shape타입을 명확하게 하려면, 런타임에 타입 정보를 유지하는 방법이 필요하다. 하나의 방법은 height속성이 존재하는지 체크해 보는 것이다. 다음 코드를 보자.
속성 체크는 런타임에 접근 가능한 값에만 관련되지만, 타입 체커 역시도 shape의 타입을 Rectangle로 보정해 주기 때문에 오류가 사라진다. 이 방법 말고 태그를 정해줘서 명시적으로 접근 가능성을 확인하는 기법도 있다.
또 다른 방법으로 타입을 클래스로 만들면 해결할 수 있다.
이 외에도 타입 연산은 런타임에 영향을 주지 않고, 런타임 타입은 선언된 타입과 다를 수 있는 경우도 있다는 특징 등이 있다. 나머지는 차례로 따로 읽어보면서 정리해야겠다.
참고 및 출처: <이펙티브 타입스크립트> (댄 밴더캄 지음, 장원호 옮김, 인사이트 ,2021)
'TIL' 카테고리의 다른 글
This Month. 1월 (0) | 2022.01.31 |
---|---|
This Week. 24 ~ 29 한 주간 정리 (0) | 2022.01.31 |
Algo. quick sort , merge sort 간단 정리 (0) | 2022.01.27 |
PS. 슬라이딩 윈도우 그리고 투포인터 (0) | 2022.01.27 |
TS. Generics 그리고 코드 중복에 관해 (0) | 2022.01.26 |