타입스크립트는 컴파일과 실행 모두 javascript로 이루어진다.
TS는 JS의 상위 집합으로, js 파일은 ts 파일이라고 할 수 있다.
이러한 특징으로 js를 ts로 마이그레이션 하는데에 이점이 있다.
하지만, TS 프로그램이지만 JS 프로그램이 아닐 수 있는 경우가 있는데,
ts에서 사용하는 구문들 변수 옆 콜론(:)들은 node로 실행하면 안되는 경우가 존재한다.
function add(a: number, b: number) {}
또한, TS는 타입 체커로 런타임에 오류를 발생 시킬 코드를 미리 찾을 수 있고 적절한 해결책을 제시할 수 있다.
만약, 일부 js 파일이 타입 체커를 통과했다면 ts 파일이라고 할 수 있다.
타입 시스템은 js의 런타임 동작을 모델링한다.
타입 시스템은 정적 타입의 정확성 보장하지 않는다.
TS를 사용하려면 설정 파일이 존재해야한다.
tsc -init 을 수행하면 tsconfig.json 파일이 만들어져 해당 파일에 config를 설정하면 된다.
최신 js/ts로 이루어진 파일을 오래된 버전에서도 실행이 가능하도록 트랜스 파일과정을 거친다.
여기서 ts 파일에서 타입 오류가 있어도 컴파일이 가능하다. ts에서는 타입 오류를 warning으로 인식하기에 일반적인 정적 타입 언어 (c, java..)와는 동작이 상이하다.
tsconfig 파일에서 오류가 존재할때 컴파일 수행을 막고 싶다면 onEmitOnError를 설정하면 된다.
하지만 ts는 런타임 과정에서 타입 체크가 불가능하다. js로 컴파일 될때 모든 인터페이스 타입, 타입 구문 등이 제거가 되기 때문이다.
이를 유지하기 위해서 해당 속성이 존재하는지 확인하는 방법과 타입 정보를 명시적으로 저장하는 태그 기법이 존재한다.
타입 연산은 런타임 성능에 영향이 없다. js로 변환되어서 제거가 되기 때문이다.
대신, 런타임 오버헤드가 없는 대신 빌드타임 오버헤드가 존재한다.
TS는 함수 오버로딩을 순전히 타입 수준에서만 지원한다. 여러 선언은 가능하지만 함수 구현은 오직 하나밖에 안된다.
JS는 덕타이핑 기반으로 TS는 이를 모델링해 구조적 타이핑을 따른다.
덕타이핑 - 객체가 어떤 타입에 부합하는 변수와 메서드를 가질 경우 해당 타입에 속한다는것.
구조적 타이핑 - 멤버만으로 타입 정의
TS는 구조적 타이핑을 통해 Unit Test를 좀 더 쉽게 할 수 있다.
타입엔 여러가지가 있지만 그 중에서도 유의할 점이 any 타입이다.