verbatimModuleSyntax(TypeScript 5.0+)는 import/export를 쓴 그대로 출력에 남기라고 강제하는 컴파일러 옵션이다. 대신 타입만 가져오는 import에는 type을 직접 표시해야 한다. import type으로 표시한 것만 지워진다.
import type { User } from './types' // 통째로 지워짐
import { fetchUser, type Query } from './api' // fetchUser만 남음
import { User } from './types' // ❌ 타입인데 type 표시가 없음- 왜 필요한가: 원래
tsc는 프로젝트 전체를 보고 "이 import는 타입으로만 쓰였다"를 판단해 알아서 지웠다. 그런데 esbuild·SWC(Speedy Web Compiler)·Babel처럼 파일 하나씩 변환하는 도구는 다른 파일을 보지 않아서 그 판단을 할 수 없다. 표시를 강제하면 어떤 도구로 변환해도 결과가 같다 - 읽는 사람도 import가 값인지 타입인지 바로 안다
- 예전 옵션
importsNotUsedAsValues와preserveValueImports를 대체한다 - 같은 문제의식의 옵션이
isolatedModules다. 파일 단위로 안전하게 변환할 수 없는 코드(다른 파일의 const enum 참조, 타입만 re-export 등)를 에러로 알려 준다 import './polyfill'처럼 부수 효과만 있는 import는 그대로 남는다. CommonJS로 출력하는 경우에는 쓸 수 있는 문법에 추가 제약이 생기므로 ESM(ECMAScript Modules) 출력(module: esnext·nodenext)과 함께 쓰는 것이 자연스럽다
모듈 문법은 ES 모듈과 CommonJS, 타입 검사를 따로 돌리는 구성은 tsc --noEmit과 타입 검사 분리.