// 런타임 코드let a = 3let b = ab.toUpperCase() // TypeError!let a: number | string = 3let b = a as string이 코드를 tsx practice.ts로 실행하면? 잘 돌아갑니다. tsc practice.ts로 컴파일하면? 타입을 변환할 수 없다는 에러가 나옵니다. 어? a의 타입이 number | string 인데, string도 포함되어 있잖아? 왜 안돼? 이 의문을 풀려면 표면적인 문법이 아니라, TypeScript가 내부적으로 어떻게 동작하는지를 이해해야 합니다. 오늘은 코드 뒤에 숨은 원리를 파헤쳐보겠습니다. TypeScript의 가장 중요한 진실: 타입은 컴파일 타임에만 존재한다컴파일 타임 vs 런타임프로그램이 실행되는..