Skip to content

tsconfig 옵션 해설

중요한 tsconfig 옵션을 용도별로 정리했습니다. 타입 검사 강화, 언어 타깃과 모듈 설정, 출력 내용 제어, import 경로 매핑, 멀티 프로젝트 빌드 구성, 나머지 검사 조정.

tsconfig는 컴파일러에 어떤 파일을 포함할지, 얼마나 엄격할지 알려줍니다. 대부분의 작업은 두 옵션이 담당합니다. target은 JavaScript 생성 수준을 정하고, strict는 안전 검사를 한 번에 켭니다. 아래는 동작을 바꾸는 옵션들이며, 기본 켜짐 플래그는 표시해 두었습니다. 설정은 베이스에서 파생시킨 뒤, 다른 부분만 재정의하세요.

참고 표 · 55 항목
55 of 55 rows
엄격함
마스터 스위치: strictNullChecks, noImplicitAny 등 여러 옵션을 한 번에 켠다.
타입을 추론할 수 없는 매개변수와 변수에서 에러 (꺼 두면 any가 됨).
null과 undefined를 모든 타입에 할당할 수 없게 된다. 명시적으로 지정해야 한다.
함수 매개변수를 반공변으로 검사한다. 불안전한 콜백 매개변수 타입을 잡아낸다.
bind, call, apply를 함수가 선언한 매개변수 기준으로 타입 검사한다.
클래스 프로퍼티가 초기값 없이 생성자에서도 할당되지 않으면 에러.
선택적 프로퍼티 { p?: T }가 명시적인 undefined 할당을 더는 받지 않는다.
기본 클래스 멤버를 가리는 멤버에 override 키워드를 요구한다.
선언만 되고 한 번도 읽히지 않는 지역 변수에서 에러.
선언만 되고 한 번도 읽히지 않는 함수 매개변수에서 에러.
아무 효과가 없는 표현식 문에서 에러.
인덱스 시그니처 키에는 점 표기법 접근을 금지한다. 대괄호를 사용한다(obj["key"]).
한 코드 경로는 값을 반환하는데 다른 경로는 반환하지 않을 때 에러.
break 없이 switch case가 다음 case로 떨어질 때 에러.
언어와 모듈
JavaScript 생성 수준(예: ES2022). 최신 target일수록 downleveling이 줄어든다.
사용할 수 있는 내장 API(예: ES2022, DOM, DOM.Iterable).
출력되는 모듈 시스템(예: ESNext, CommonJS, NodeNext).
Node의 실제 규칙을 따른다. 각 파일은 가장 가까운 package.json에서 CJS 또는 ESM을 선택하고, 상대 import에는 확장자가 필요하다.
import 경로를 해석하는 방식(예: bundler, node, nodenext).
파일이 모듈로 간주되는 조건: auto(import/export 존재 여부), legacy, force(항상).
CommonJS 모듈에서 default-import 방식을 허용한다(대부분의 설정에서 기본 true).
명명된 값만 export하는 모듈에서 default import를 허용한다(타입 수준만).
import는 작성한 그대로 출력된다. 타입 전용 import는 import type을 써야 한다(TS 5).
import가 .json 파일을 타입이 있는 값으로 로드하게 한다.
.js 파일을 컴파일 입력에 포함한다.
.js 파일도 JSDoc 주석을 읽으며 타입 검사한다. allowJs를 내포한다.
.tsx 컴파일 방식: react-jsx(자동 런타임), react(React.createElement), preserve.
자동으로 포함되는 @types 패키지를 이 목록으로 제한한다. 빈 배열이면 아무것도 포함하지 않는다.
@types 패키지를 탐색할 폴더. 트리를 따라 올라가며 모든 node_modules/@types를 보는 대신 쓴다.
모든 파일이 격리 상태에서 트랜스파일 가능함을 보장한다(bundler와 esbuild가 요구).
출력 (emit)
컴파일된 JavaScript가 기록되는 위치.
소스 파일의 루트. 출력 트리 모양을 안정적으로 유지한다.
.js.map 파일을 내보내 디버거가 TypeScript로 되돌아갈 수 있게 한다.
source map을 .js.map 파일 대신 .js 파일 안에 주석으로 포함한다.
.d.ts 타입 선언을 내보낸다(라이브러리에 필요).
.d.ts.map 파일을 내보내 에디터가 선언에서 TypeScript 소스로 점프하게 한다.
.d.ts 파일만 내보낸다. JavaScript는 bundler에 맡긴다(declaration 또는 composite 필요).
__rest 같은 헬퍼를 매 파일에 쓰지 않고 tslib에서 재사용한다.
target이 ES2015 이전일 때 iterable의 for..of, spread, 구조 분해를 올바르게 처리한다.
출력되는 JavaScript에서 주석을 제거한다.
타입 검사만 하고 파일을 쓰지 않는다(bundler가 emit을 맡을 때 사용).
경로
비상대 모듈 해석의 기준 디렉터리.
import 접두사를 위치에 매핑한다. 예: { "@/*": ["src/*"] }.
여러 디렉터리를 해석용 단일 가상 루트로 취급한다.
프로젝트 구조
프로젝트를 project reference용으로 빌드 가능하게 표시한다(declaration, incremental을 켠다).
다른 tsconfig 프로젝트에 의존해 더 빠르고 격리된 빌드를 한다.
빌드 정보를 저장해 다음 실행에서 변경되지 않은 파일의 재검사를 건너뛴다.
기타 검사
속도를 위해 .d.ts 파일의 타입 검사를 건너뛴다(기본 true).
파일의 실제 대소문자와 일치하지 않는 import에서 에러.
배열과 인덱스 접근이 T가 아니라 T | undefined를 반환한다.
클래스 필드를 단순 할당 대신 Object.defineProperty로 생성한다(ES2022+ target에서 기본 true).
오래된 프레임워크가 사용하는 레거시 데코레이터 구문을 켠다(표준 이전).
긴 타입 이름을 자르지 않고 에러 메시지에 전체를 표시한다.
본문 없는 부수효과 import(import "./x.css")가 아무것도 해석되지 않으면 에러.
.ts로 끝나는 import 경로를 허용한다(noEmit 또는 emitDeclarationOnly 필요).