--noEmit은 tsc에게 타입 검사만 하고 JavaScript 파일은 만들지 말라고 하는 옵션이다. 오류가 있으면 0이 아닌 종료 코드로 실패하고, 없으면 조용히 끝난다.
- 왜 필요한가: Vite, esbuild, SWC(Speedy Web Compiler), Babel, Vitest 같은 요즘 도구는 TS의 타입 표기를 지우기만 하고 검사하지 않는다. 그래서 타입 오류가 있어도 개발 서버, 빌드, 테스트가 그대로 돌아간다
- 그래서 역할을 나눈다. 산출물은 번들러가 만들고,
tsc는 검사기로만 쓴다.tsconfig.json에"noEmit": true를 두는 템플릿이 많다 - 흔한 함정: 테스트는 통과했는데
build스크립트(tsc --noEmit && vite build)에서만 실패하는 경우다. 테스트 러너도 타입을 안 보기 때문이다. 테스트 스크립트 앞에tsc --noEmit을 붙이거나 CI(Continuous Integration)에서 따로 돌려 간극을 없앤다 - 검사 범위는 tsconfig의
include가 정한다. 테스트 파일도 포함되면 함께 검사된다 import './a.ts'처럼 확장자를 쓰게 해 주는allowImportingTsExtensions는noEmit(또는emitDeclarationOnly)일 때만 켤 수 있다. JS를 내보내지 않으니 경로를 고칠 일이 없기 때문이다- 파일을 안 쓸 뿐 검사 비용은 그대로다. 자주 돌린다면
--incremental이나--watch로 줄인다
파일 단위 변환 도구와 맞추기 위한 다른 옵션은 verbatimModuleSyntax와 import type, 전체 옵션은 tsconfig 핵심 옵션. CI에 넣는 방법은 GitLab CI/CD 파이프라인 같은 파이프라인 노트 참고.