TypeScript의 tsconfig.json 파일 살펴보기
2023년 03월 16일
1. tsconfig.json는 무엇인가
TypeScript에서는 tsconfig.json
파일을 사용하여 컴파일러에게 프로젝트의 컴파일 설정을 지정할 수 있습니다. 이 파일은 프로젝트 루트 디렉토리에 위치하며, tsc 명령어를 사용하여 TypeScript 코드를 컴파일할 때 이 파일의 설정이 적용됩니다.
{
"compilerOptions": {
"target": "es6",
"module": "commonjs"
},
}
대략 루트 디렉토리의 최상위에 존재하며 이름은 tsconfig.json으로 설정해야합니다.
옵션에는 크게 compilerOptions, files, include, exclude이 존재합니다.
2. tsconfig.json의 옵션에 대해서 알아보자
2-1. files
타입스크립트의 tsconfig.json
파일의 files
옵션은 프로젝트에서 컴파일할 파일 목록을 설정하는 옵션입니다.
이 옵션을 사용하여 특정 파일을 컴파일하도록 명시적으로 지정할 수 있습니다. 만약 files
옵션을 지정하지 않으면, 컴파일러는 include
옵션에 지정된 디렉토리 하위의 모든 파일을 컴파일합니다.
files
옵션을 사용하면, 프로젝트에서 컴파일할 파일 목록을 명시적으로 지정할 수 있습니다. 이는 컴파일 시간을 단축시킬 수 있으며, 불필요한 파일을 제외하여 컴파일 오류를 줄일 수 있습니다.
예를 들어, 아래와 같이 tsconfig.json
파일에 files
옵션을 지정할 수 있습니다.
{
"compilerOptions": {
"target": "es6",
"module": "commonjs"
},
"files": ["src/main.ts", "src/utils.ts"]
}
위의 예시에서는 src
디렉토리 내의 main.ts
와 utils.ts
파일만 컴파일 대상으로 지정되며, 다른 파일은 컴파일 대상에서 제외됩니다.
2-2. include
타입스크립트의 tsconfig.json
파일의 include
옵션은 컴파일러가 컴파일할 TypeScript 소스 코드 파일의 디렉토리와 파일 패턴을 지정하는 옵션입니다.
이 옵션을 사용하여 컴파일러에게 컴파일할 파일의 위치를 알려주고, 해당 위치에서 파일 패턴을 사용하여 컴파일할 파일을 선택할 수 있습니다.
include
옵션은 배열로 구성되며, 각 요소는 디렉토리 경로 또는 파일 패턴을 지정합니다. 디렉토리 경로를 지정하는 경우 해당 디렉토리와 그 하위 디렉토리의 모든 TypeScript 파일이 컴파일됩니다. 파일 패턴을 지정하는 경우 해당 패턴과 일치하는 TypeScript 파일만 컴파일됩니다.
예를 들어, 다음과 같이 tsconfig.json
파일에 include
옵션을 지정할 수 있습니다.
{
"compilerOptions": {
"target": "es6",
"module": "commonjs"
},
"include": [
"src/**/*.ts"
"src/**/*.tsx"
]
}
위의 예시에서는 src
디렉토리 및 그 하위 디렉토리의 모든 TypeScript 파일이 컴파일 대상으로 지정됩니다. 패턴 \*\*
는 모든 하위 디렉토리를 의미합니다.
include
옵션은 exclude
옵션과 함께 사용할 수 있습니다. exclude
옵션은 컴파일 대상에서 제외할 파일이나 디렉토리를 지정합니다. include
옵션으로 지정된 파일 중 exclude
옵션으로 지정된 파일이 제외됩니다.
2-3. exclude
exclude
옵션은 TypeScript 컴파일러가 컴파일하지 않아도 되는 파일을 지정하는 옵션입니다. 보통 exclude
옵션을 사용하여 컴파일할 필요가 없는 파일을 제외하고, 컴파일 속도를 높이는 데 사용합니다.
exclude
옵션은 다음과 같은 패턴으로 파일을 지정할 수 있습니다.
- 파일 확장자:
*.js
,*.css
,*.json
등 - 디렉터리 이름:
test/
,src/**/test/
등 - 반드시 제외해야 하는 파일:
node_modules/
예를 들어, 다음과 같이 tsconfig.json
파일에 exclude
옵션을 설정하면, TypeScript 컴파일러는 .js
, .css
, .json
파일과 node_modules
디렉터리를 컴파일하지 않습니다.
{
"exclude": ["node_modules", "**/*.js", "**/*.css", "**/*.json"]
}
exclude
옵션은 include
옵션과 함께 사용될 때, include
옵션으로 지정한 파일만 컴파일하도록 설정할 수 있습니다.
2-4. compilerOptions
타입스크립트의 tsconfig.json
파일의 compilerOptions
옵션은 컴파일러의 동작을 제어하는 옵션입니다. 이 옵션을 사용하여 컴파일러의 출력 형식, 빌드 시 경고 및 오류 처리 방식, 코드 생성 옵션 등을 설정할 수 있습니다.
compilerOptions에는 정말 많은 세부 옵션이 존재합니다. 그중에서 몇 가지만 가져왔습니다.
2-4-1. target
컴파일된 자바스크립트 코드 ECMAScript 버전을 설정합니다. 예를 들어, es5
,
es6
, es2015
, esnext
등의 값을 지정할 수 있습니다. 최신문법을 작성해도
es5로 컴파일한다면 예전 문법으로 변경됩니다.
무슨 import 문법 쓸건지 설정합니다. commonjs
, amd
, es2015
, esnext
등이
있습니다.
// esnext
import abc from "./abc";
2-4-3. allowJs
true일 경우 js 파일들을 ts 파일에서 import해서 쓸 수 있습니다.
자바스크립트 파일을 타입 검사합니다.
tsx 파일을 jsx로 어떻게 컴파일할 것인지 설정합니다. 5가지의 옵션이 존재합니다. 보통 preserve를 사용합니다.
-
react : .js 파일로 컴파일 (JSX 코드는 React.createElement() 함수의 호출로 변환된다)
-
react-jsx : .js 파일로 컴파일 (JSX 코드는 _jsx() 함수의 호출로 변환된다)
-
react-jsxdev : .js 파일로 컴파일 (JSX 코드는 _jsx() 함수의 호출로 변환된다)
-
preserve : .jsx 파일로 컴파일 (JSX 코드가 그대로 유지된다)
-
react-native : .js 파일로 컴파일 (JSX 코드가 그대로 유지된다)
// Original TypeScript Sample Code
export const helloWorld = () => <h1>Hello world</h1>;
// Default: "react"
export const helloWorld = () => React.createElement("h1", null, "Hello world");
// React 17 transform: "react-jsx"
import { jsx as _jsx } from "react/jsx-runtime";
export const helloWorld = () => _jsx("h1", { children: "Hello world" }, void 0);
// React 17 dev transform: "react-jsxdev"
import { jsxDEV as _jsxDEV } from "react/jsx-dev-runtime";
const _jsxFileName =
"/home/runner/work/TypeScript-Website/TypeScript-Website/packages/typescriptlang-org/index.tsx";
export const helloWorld = () =>
_jsxDEV(
"h1",
{ children: "Hello world" },
void 0,
false,
{ fileName: _jsxFileName, lineNumber: 7, columnNumber: 32 },
this
);
// Preserve: "preserve"
export const helloWorld = () => <h1>Hello world</h1>;
// React Native: "react-native"
export const helloWorld = () => <h1>Hello world</h1>;
2-4-6. declaration
컴파일시 .d.ts 파일도 자동으로 함께생성됩니다. .d.ts 파일이란
.d.ts
는 TypeScript Definition 파일의 확장자입니다. TypeScript는 JavaScript의 상위 집합 언어로 정적 타입 검사, 클래스, 인터페이스 등의 기능을 제공합니다. 하지만 TypeScript로 작성된 코드를 JavaScript로 컴파일하면 타입 정보가 사라지기 때문에 다른 개발자들이 TypeScript 코드를 사용하기 어렵습니다. 이때,.d.ts
파일을 사용하면 TypeScript 코드에서 선언한 타입 정보를 코드 외부에 따로 저장하여 다른 개발자들이 TypeScript 코드를 사용할 때 유용하게 사용할 수 있도록 합니다. 이 파일은 주로 외부 라이브러리에서 제공되며, TypeScript에서 해당 라이브러리를 사용할 때 필요합니다.
컴파일시 주석을 제거해줍니다.
컴파일된 자바스크립트 파일의 출력 디렉토리를 설정합니다.
컴파일된 자바스크립트 파일을 생성하지 않습니다.
TypeScript 프로젝트에서 모듈을 로드할 때 모듈 이름을 해석하는 기준 경로를 지정하는 옵션입니다. baseUrl
을 설정하면 상대 경로로 모듈을 로드하는 대신, 절대 경로로 모듈을 로드할 수 있습니다.
// tsconfig.json
"baseUrl": "./src",
// abc/foo.js
import zxc from '../src/zxc' // 이 방식 대신
import zxc from 'zxc' // 절대경로 사용가능
2-4-11. strict
strict
옵션은 TypeScript에서 제공하는 여러 개의 타입 체크 옵션을 모두 활성화하는 옵션입니다. strict
옵션을 true
로 설정하면 다음과 같은 타입 체크 옵션이 활성화됩니다.
-
noImplicitAny: 암묵적 any를 사용할 수 없게 됩니다.
-
strictNullChecks: null 또는 undefined이 될 수 있는 값에 대해 엄격하게 체크합니다.
-
strictFunctionTypes: 함수 타입의 매개변수와 반환 값에 대해 엄격하게 체크합니다.
-
strictPropertyInitialization: 클래스의 프로퍼티가 초기화되지 않았다면 오류를 발생시킵니다.
-
noImplicitThis: this 키워드의 타입이 암묵적 any로 처리되는 것을 막습니다.
strict
모드를 사용하면 코드의 안정성을 높일 수 있으며, 타입 오류를 미리 방지할 수 있습니다. 하지만 코드 작성 시 더 많은 주의가 필요하며, 타입 오류를 조금 더 자세하게 해결해야 할 수도 있습니다. 따라서 프로젝트의 규모와 성격에 따라 strict
모드를 사용할 지 결정해야 합니다.
skipLibCheck
옵션은 TypeScript 컴파일러가 .d.ts
파일을 타입 체크하지 않도록 설정하는 옵션입니다. .d.ts
파일은 보통 외부 라이브러리나 프레임워크에서 제공하는 타입 선언 파일입니다.
일반적으로 .d.ts
파일은 이미 타입 체크가 이루어져 있으므로, TypeScript 컴파일러가 다시 타입 체크를 하지 않도록 skipLibCheck
옵션을 사용합니다. 이 옵션을 사용하면 컴파일 시간이 줄어들어 빌드 속도를 높일 수 있습니다.
하지만 외부 라이브러리나 프레임워크에서 제공하는 .d.ts
파일이 잘못된 타입을 선언하거나 누락된 타입이 있을 수 있으므로, skipLibCheck
옵션을 사용하기 전에 신중하게 검토해야 합니다.
참고 문서
https://www.typescriptlang.org/ko/docs/handbook/tsconfig-json.html
https://it-eldorado.tistory.com/128
https://codingapple.com/unit/typescript-tsconfig-json/