
타입스크립트는 구조적 타입 시스템을 사용합니다. 타입을 명시할 때는 부모–자식 처럼 보이는 계층적 할당 가능성 규칙에 따라 값이 허용되거나 거부됩니다.

이 계층도에서 최상위에 가까울수록 더 많은 타입을 받아들일 수 있습니다. 안전하지만 unknown은 직접 쓰려면 좁히기가 필요하고, any도 타입을 모를 때 임시로 쓰지만, 모든 검사를 우회하기 때문에 개발이 끝난 뒤에는 구체적인 타입을 지정하는 것이 좋습니다.
반대로 최하위인 never는 값이 절대 발생하지 않는 타입으로, 다운캐스트가 불가능합니다.
let num2: 10 = 10;
let num1: number = num2;
업캐스트는 자식 타입의 값을 부모 타입으로 취급하는 것이며 문제없이 허용됩니다.
let num3: number = 10;
let num4: 10;
num4 = num3; //오류
다운캐스트는 부모 타입을 자식 타입으로 취급 하는 것인데, 대부분의 경우 불가하며 조심해야 합니다.

위 그림은 타입 간 호환도를 보여줍니다.
타입스크립트는 오류를 잡을 때 변수에 값을 넣을 수 있는지, 객체 리터럴의 과잉 속성 여부를 검사하고 코드 흐름에 따라 타입을 점점 구체적으로 좁혀 갑니다. 또한 strict 모드와 같은 정밀 옵션을 통해 컴파일 시점에 안전성을 강화합니다.
바닐라 JS 코드를 타입스크립트로 변환할 때는 에디터가 타입을 잘 보여줘서 깊이 생각하지 않게 되지만, 이번 정리로 TS가 단순히 “타입을 명시하는 언어”가 아니라는 걸 느꼈습니다. any처럼 강력하지만 위험한 타입도 있고, 다운캐스트는 근거 있는 좁히기 후에만 안전하다는 점을 알게 되어, 더 많이 고민하며 개발하게 되는 계기가 되었습니다.