Effecive:
형용사
원하는 또는 의도된 결과를 생성하는 데 성공적인.
elegent한 TypeScript 코드 작성이라는 결과를 위해 effective TypeScript를 이해와 의문점을 기록으로 남기기 위해 적어도 주 일 회 각 장 별로 포스팅을 합니다.
⚠️ TypeScript를 1도 모르는 상태에서 보기 시작했으며 이해가 미흡하며 틀린 내용이 많을 수 있습니다.
🙏 제가 가진 의문점에 대한 답변 혹은 의견을 댓글로 고견을 남겨주시면 감사하겠습니다.
Key Point
TypeScript는 사용 방식 면에서 조금 독특합니다.
Python이나 Ruby 같이 인터프리터로 실행되는 것이 아니고, C나 Java 같이 low-level 언어로 컴파일 되는 것도 아닙니다.
TypeScript는 다른 고수준 언어인 JavaScript로 컴파일 되며, runtime 시 JavaScript로 실행됩니다.
그러므로, JS와 TS의 관계는 밀접하며 혼란스러운 일이 왕왕 발생하기 때문에 JS와 TS의 관계를 이해가 선행되어야 합니다.
또한, TypeScript의 타입 시스템 또한 독특한 특징을 가지므로 자세히 알아둬야 합니다.
TypeScript는 JavaScript의 superset이다.
즉, TypeScript는 JavaScript 상위 집합이다.
TypeScript와 JavaScript의 관계는 집합의 관점에서 살펴봐야합니다.
모든 JS 프로그램은 TS (O)
모든 TS 프로그램은 JS (X)
TS는 문법적으로도 JS의 상위 집합입니다.
➡️ JS코드가 문법 오류가 없다면 유효한 TS코드
그런데, JS코드에서 어떤 이슈가 존재한다면 TS(타입 체커)에게 지적을 당할 가능성이 많습니다.
TS는 JS의 상위 집합이기 때문에 .js 파일에 있는 코드는 이미 TS코드라고 할 수 있습니다.
위와 같은 특성은 JS를 TS로 마이그레이션 하는데 엄청난 이점이 됩니다.
기존 JS 코드를 유지하면서 일부분에 TS코드를 적용할 수 있기 때문입니다.
? 의문점 : 정적 타입이기 때문도 맞지만 런타임 이전에 수행 될 수 있기 때문에 가능한 것이 아닌가?
모든 JS는 TS이지만, 일부 JS만이 타입 체크를 통과합니다.
JS 런타임 동작을 모델링 하는것은 TS의 기본 원칙입니다.
그러나 단순히 런타임 동작을 모델링 하는 것 뿐 아니라, 의도치 않은 이상한 코드가 오류로 이어질 수도 있다는 점도 고려해야 합니다.
타입 체크 여부는 개발자의 선택에 달렸습니다.
TS의 컴파일러는 매우 많은 설정(config)을 가지고 있습니다. 현 시점에서 거의 100개에 이릅니다.
커멘드 라인에서 사용법
$ tsc --noImplicitAny program.ts
tsconfig.json 설정파일
{
"compilerOptions": {
"noImplicitAny": true
}
}
TS를 어떻게 사용할 것인지 명시적으로 기록 할 수 있어, 가급적 설정 파일을 사용하는 것이 좋습니다.
이는 동료들과 다른 도구들이 확인 할 수 있습니다.
설정 파일 생성 방법
$ tsc --init
TS는 타입 정보를 가질 때 가장 효과적이기 때문에 any 속성을 지양해야됩니다.
그러므로, noImplicitAny를 서렁하여 코드를 작성할 때마다 타입을 명시하도록 해야합니다.
TypeScript compiler의 두 가지 역할
1. 최신 TS/JS를 브라우저에서 동작할 수 있도록 구버전의 JS로 트랜스파일링
2. 코드의 타입 오류 체크
이 두가지 동작은 전혀 관계 없이 독립적인 동작임을 이해해야합니다.