[번역]The TSConfig Cheet Sheet
원글: https://www.totaltypescript.com/tsconfig-cheat-sheet (opens in a new tab)
tsconfig.json은 엄청나게 많은 잠재적 옵션을 가진 거대한 파일로, 많은 사람들을 두렵게 합니다.
하지만 실제로 주의해야 할 구성 옵션은 몇 가지뿐입니다. 이 옵션들을 파악하고 치트시트를 작성해 보겠습니다.
Quickstart
코드만 원하신다면 여기 있습니다:
{
"compilerOptions": {
/* 기본 옵션: */
"esModuleInterop": true,
"skipLibCheck": true,
"target": "es2022",
"allowJs": true,
"resolveJsonModule": true,
"moduleDetection": "force",
"isolatedModules": true,
"verbatimModuleSyntax": true,
/* 엄격함(Strictness) */
"strict": true,
"noUncheckedIndexedAccess": true,
"noImplicitOverride": true,
/* TypeScript로 트랜스파일링하는 경우: */
"module": "NodeNext",
"outDir": "dist",
"sourceMap": true,
/* 라이브러리를 위해 빌드하는 경우: */
"declaration": true,
/* 모노레포에서 라이브러리를 위해 빌드하는 경우: */
"composite": true,
"declarationMap": true,
/* TypeScript로 트랜스파일링하지 않는 경우: */
"module": "preserve",
"noEmit": true,
/* 코드가 DOM에서 실행되는 경우: */
"lib": ["es2022", "dom", "dom.iterable"],
/* 코드가 DOM에서 실행되지 않는 경우: */
"lib": ["es2022"]
}
}전체 설명
기본 옵션
아래는 모든 프로젝트에 권장되는 기본 옵션입니다.
{
"compilerOptions": {
"esModuleInterop": true,
"skipLibCheck": true,
"target": "es2022",
"allowJs": true,
"resolveJsonModule": true,
"moduleDetection": "force",
"isolatedModules": true,
"verbatimModuleSyntax": true
}
}-
esModuleInterop(opens in a new tab): CommonJS와 ES 모듈 간의 몇 가지 차이를 해결하는 데 도움이 됩니다. -
skipLibCheck(opens in a new tab): .d.ts 파일의 타입검사를 건너뜁니다. 설정하지 않을 경우 모든node_modules가 검사될 것이기 때문에 성능 면에서 중요한 옵션입니다. -
target(opens in a new tab): 대상으로 하는 JavaScript 버전입니다. 안정성을 위해exnext보다는es2022를 권장합니다. -
allowJs(opens in a new tab) 및resolveJsonModule(opens in a new tab): .js 및 .json 파일을 import 할 수 있습니다. 항상 유용합니다. -
moduleDetection(opens in a new tab): 모든 파일을 모듈로 취급하도록 강제합니다. 이는 'cannot redeclare block-scoped variable (opens in a new tab)'에러를 방지하는데 도움이 됩니다. -
isolatedModules(opens in a new tab): 모듈을 독립된 파일로 취급할 때 안전하지 않은 몇 가지 TS 기능을 방지합니다. -
verbatimModuleSyntax(opens in a new tab):import type및export type사용을 강제합니다. 이는 더 예측 가능한 동작을 유도하고 불필요한 import를 줄이는 데 도움이 됩니다.module: NodeNext와 함께 사용하면 ESM(ES 모듈), CJS(CommonJS) 에서 올바른 import syntax 사용을 강제합니다.
엄격함(Strictness)
모든 프로젝트에 권장되는 엄격함 옵션입니다.
{
"compilerOptions": {
"strict": true,
"noUncheckedIndexedAccess": true,
"noImplicitOverride": true
}
}-
strict(opens in a new tab): 모든 엄격한 타입 검사 옵션을 활성화합니다. Indispensable. -
noUncheckedIndexedAccess(opens in a new tab): 배열이나 객체에 접근하기 전에 정의되었는지 먼저 확인합니다. 이는 런타임 에러를 방지하는 좋은 방법이며,strict에 포함되어야한다고 생각합니다. -
noImplicitOverride(opens in a new tab): 클래스에서override키워드를 쓸모 있도록 만듭니다.
많은 사람들이 tsconfig/bases (opens in a new tab)에서 엄격함 옵션을 추천했습니다.이는 TSConfig 옵션을 카탈로그화한 훌륭한 저장소입니다.
해당 옵션들은 noImplicitReturns, noUnusedLocals, noUnusedParameters, noFallthroughCasesInSwitch와 같이 너무 시끄럽다(noisy)고 생각하는 많은 규칙을 포함하고 있기 때문에, 이 규칙들을 원하는 경우에만 tsconfig.json에 추가하는 것을 추천합니다.
TypeScript로 트랜스파일링
tsc로 코드를 트랜스파일링(JavaScript 파일 생성)하는 경우, 다음 옵션이 필요합니다.
{
"compilerOptions": {
"module": "NodeNext",
"outDir": "dist"
}
}-
module(opens in a new tab): TypeScript에 어떤 모듈 Syntax를 사용할지 알려줍니다.NodeNext는 Node에 최적이며,moduleResolution: NodeNext옵션이 암시적으로 포함됩니다. -
outDir(opens in a new tab): 컴파일된 JavaScript 파일을 저장할 위치를 지정합니다.dist디렉토리를 선호하지만, 개인 취향 및 선택에 따라 바꿀 수 있습니다.
라이브러리를 위한 빌드
라이브러리를 위해 빌드하는 경우, declaration 옵션을 활성화하여 타입 정의 파일을 생성할 수 있습니다.
{
"compilerOptions": {
"declaration": true
}
}declaration(opens in a new tab): 라이브러리의 사용자가 타입 정보를 사용할 수 있도록 .d.ts 파일을 생성합니다.
모노레포에서 라이브러리를 위해 빌드하는 경우
모노레포 구조에서 여러 라이브러리를 관리할 때는 아래와 같은 옵션들이 필요합니다.
{
"compilerOptions": {
"declaration": true,
"composite": true,
"sourceMap": true,
"declarationMap": true
}
}-
composite(opens in a new tab): TypeScript 에게.tsbuildinfo파일을 생성하도록 합니다. 프로젝트가 모노레포의 일부임을 알려주고 빌드를 캐시하여 더 빠르게 실행할 수 있도록 도와줍니다. -
sourceMap(opens in a new tab)과declarationMap(opens in a new tab): TypeScript 에게 source map과 declaration map을 생성하도록 합니다. 이는 라이브러리 사용자가정의로 이동(go-to-definition)기능을 사용해 원본 소스코드로 이동할 수 있도록하며, 디버깅을 용이하게 합니다.
TypeScript로 트랜스파일링하지 않는 경우
TypeScript를 Linter로 사용하는 등, tsc를 사용할 때 JavaScript로 트랜스파일링하지 않으려면 아래의 옵션을 사용합니다.
{
"compilerOptions": {
"module": "preserve",
"noEmit": true
}
}-
module(opens in a new tab):preserve는 번들러가 모듈을 처리하는 방식을 가장 비슷하게 모방하기 때문에 최선의 옵션입니다.moduleResolution: Bundler(opens in a new tab) 옵션이 암시적으로 포함됩니다. -
noEmit(opens in a new tab): TypeScript가 JavaScript 파일을 생성하지 않도록 합니다. 번들러를 사용할 때 불필요한 js 파일을 생성하지 않고 타입 검사만 수행합니다.
코드가 DOM에서 실행되는 경우
웹 브라우저에서 코드를 실행할 때는 lib 옵션을 사용하여 DOM 관련 타입을 포함시킵니다.
{
"compilerOptions": {
"lib": ["es2022", "dom", "dom.iterable"]
}
}lib(opens in a new tab): 사용할 라이브러리를 지정합니다.es2022는 안정성을 위해 권장되며,dom과dom.iterable은window,document등의 타입을 추가합니다.
코드가 DOM에서 실행되지 않는 경우
서버 사이드나 Node.js 환경에서 코드를 실행할 때는 DOM 관련 타입을 제외할 수 있습니다.
{
"compilerOptions": {
"lib": ["es2022"]
}
}변경 로그
TypeScript가 진화하고 재사용 가능한 tsconfig.json에 대한 내 견해를 정제함에 따라 이 치트시트를 업데이트해 왔습니다. 여기에 변경 로그가 있습니다:
-
2024-04-23:
module: Preserve의 도입으로verbatimModuleSyntax가 훨씬 더 유용해졌기 때문에 기본 옵션에verbatimModuleSyntax를 추가했습니다. 많은 애플리케이션이 CommonJS로 변환되는 가짜 ESM을 작성합니다. Next.js가 일반적인 예입니다.module: Preserve이전에는verbatimModuleSyntax가 모듈을 예상하여 모든 import 또는 export 문에서 오류가 발생했습니다.module: Preserve를 사용하면import/export type가 올바르게 사용되는지 확인하는 범위가 좁아집니다. -
2024-04-23: 엄격성 옵션에
noImplicitOverride를 추가했습니다. 책을 조사하는 동안 이 옵션이나override키워드를 알지 못했습니다.noImplicitOverride는 비용 없이 아주 작은 개선 사항이므로 왜 사용하지 않겠습니까?
출처
해당 번역은 ChatGPT의 도움을 받아 번역되었습니다.