tsc index.ts
--
플래그로 사용할 수 있습니다.--noEmit
플래그를 전달합니다.tsc index.ts --noEmit
tsc --help
를 실행해 일반적으로 사용하는 CLI 플래그 목록을 가져올 수 있습니다.tsc CLI는 색상과 간격의 스타일을 지정해 가독성을 높이는 pretty 모드를 지원합니다.
여러 가지 색이 없는 더 압축된 CLI 출력을 선호한다면 tsc 명령에 명시적으로 --pretty false
플래그를 제공해 TypeScript에 더 간결하고 색상이 없는 형식을 사용하도록 지시합니다.
-w
나 --watch
플래그를 제공해 watch 모드를 사용할 수 있습니다.watch 모드를 사용하면 종료하는 대신 TypeScript를 무기한 실행 상태로 유지하고 모든 오류의 실시간 목록을 가져와서 터미널을 지속적으로 업데이트합니다.
watch 모드는 여러 파일에 걸쳐서 리팩터링 같은 대규모 변경 작업을 할 때 특시 유용합니다.
-p
또는 --project
플래그로 전달합니다.tsc -p path/to/tsconfig.json
--init
플래그를 전달하여 tsconfig.json 파일을 생성할 수 있습니다.tsc --init
CLI와 TSConfig 파일에서 사용 가능한 대부분의 옵션은 다음 2 가지 범주 중 하나로 분류됩니다.
2 가지 범주 외에 프로젝트 레퍼런스(project reference)와 같은 다른 설정은 TSConfig 파일에서만 사용할 수 있습니다.
Tip
- CLI 또는 production 빌드를 위한 일회성 변경과 같은 설정이 tsc CLI에 제공되는 경우, TSConfig 파일에 명시된 모든 값을 재정의합니다.
{
"include": ["src"]
}
위의 구성 파일은 tsconfig.json과 관련된 src/ 디렉터리 안에 모든 TypeScript 소스 파일을 재귀적으로 포함합니다.
포함된 파일을 더 세밀하게 제어하기 위해 include 문자열에 글로브 와일드 카드가 허용합니다.
*
: 0개 이상의 문자와 일치?
: 하나의 문자와 일치**/
: 모든 레벨에 중첩된 모든 디렉터리와 일치{
"include": [
"typings/**/*.d.ts",
"src/**/*??.*"
]
}
위의 구성 파일은 typings/ 하위의 중첩된 디렉터리의 .d.ts 파일과 확장자 앞의 파일 명에 적어도 2개 이상의 문자를 가진 src/ 하위의 파일만을 포함합니다.
대부분의 프로젝트에서는 ["src"]와 같은 간단한 include 컴파일러 옵션으로도 충분합니다.
{
"exclude": ["**/external", "node_modules"],
"include": ["src"]
}
위의 구성 파일은 중첩된 external 디렉터리와 node_modules 디렉터리 내의 모든 파일을 제외하고 src/ 내의 모든 파일을 포함합니다.
프로젝트 내 폴더에 노드 모듈을 설치하는 대부분의 JavaScript 프로젝트는 exclude에 "node_modules"를 포함합니다.
exclude는 include의 시작 목록에서 파일을 제거하는 작업만 수행합니다.
const MyComponent = () => {
// return React.createElement("div", null, "Hello, world")와 같음
return <div>Hello, world!</div>
};
값 | 입력 코드 | 출력 코드 | 출력 파일 확장자 |
---|---|---|---|
"preserve" | <div /> | <div /> | .jsx |
"react" | <div /> | React.createElement("div") | .js |
"react-native" | <div /> | <div /> | .js |
tsc --jsx preserve
{
"compileOptions": {
"jsx": "preserve"
}
}
<T>
를 작성하려고 하면, T 요소의 시작 태그로 인식하여 T 태그의 종료 태그가 없기 때문에 구문 오류가 발행합니다.const identity = <T>(input: T) => input;
// Error: JSX element 'T' has no corresponding closing tag.
=unknown
제약 조건을 추가할 수 있습니다.const identity = <T = unknown>(input: T) => input; // Ok
TypeScript는 resolveJsonModule 컴파일러 옵션을 true로 설정하면 .json 파일을 읽을 수 있습니다.
객체가 포함된 JSON 파일이라면 구조 분해 가져오기(destructuring import)를 사용합니다.
// activist.json
{
"activist": "Mary Astell"
}
// useActivist.ts
import { activist } from './activist.json';
console.log(activist); // "Mary Astell"
// useActivist.ts
import activist from './activist.json';
console.log(activist); // "Mary Astell"
*
를 사용합니다.// activists.json
[
"Ida B. Wells",
"Sojourner Truth",
"Tawakkul Karman"
]
// useActivists.ts
import * as activists from "./activists.json";
console.log(`${activists.length} activists`); // "3 activists"
fruits/
apple.js
apple.ts
vegetables/
zucchini.js
zucchini.ts
tsc --outDir dist
dist/
fruits/
apple.js
vegetables/
zucchini.js
fruits/
apple.ts
vegetables/
zucchini.ts
tsc --outDir lib
lib/
fruits/
apple.js
vegetables/
zucchini.js
src/
fruits/
apple.ts
vegetables/
zucchini.ts
TypeScript는 ES3(1993년경)과 같은 오래된 환경에서 실행할 수 있는 JavaScript 출력 파일을 생성할 수 있습니다.
TypeScript는 JavaScript 코드 구문을 지원하기 위해 어느 버전까지 변환해야 하는지를 지정하는 target 컴파일러 옵션을 제공합니다.
tsc --init
은 기본적으로 "es2016"을 지정하도록 설정되어 잇습니다. Tip
- 2022년에는 전 세계 사용자의 0.1% 이상을 서비스하는 브라우저의 모든 배포 버전은 최소한 모든 ECMAScript2019와 거의 모든 ECMAScript2020~2021을 지원합니다.
- 또한 LTS 지원 버전의 Node.js는 모든 ECMAScript2021을 지원합니다.
- 그러므로 target을 적어도 "es2019" 이상으로 지정하지 않을 이유가 없습니다.
// ES2015의 const, ES2020의 nullish 병합 연산자 ??
function defaultNameAndLog(nameMaybe: string | undefined) {
const name = nameMaybe ?? 'anonymous';
console.log('From', nameMaybe, 'to', name);
return name;
}
tsc --target es2020
:string | undefined
만 제거합니다.function defaultNameAndLog(nameMaybe) {
const name = nameMaybe ?? 'anonymous';
console.log('From', nameMaybe, 'to', name);
return name;
}
tsc --target es2015
function defaultNameAndLog(nameMaybe) {
const name = nameMaybe !== null && nameMaybe !== void 0
? nameMaybe
: 'anonymous';
console.log('From', nameMaybe, 'to', name);
return name;
}
tsc --target es3
function defaultNameAndLog(nameMaybe) {
var name = nameMaybe !== null && nameMaybe !== void 0
? nameMaybe
: 'anonymous';
console.log('From', nameMaybe, 'to', name);
return name;
}
tsc --declaration
// tsconfig.json
{
"compilerOptions": {
"declaration": true,
}
}
fruits/
apple.d.ts
apple.js
apple.ts
vegetables/
zucchini.d.ts
zucchini.js
zucchini.ts
tsc --emitDeclarationOnly
// tsconfig.json
{
"compilerOptions": {
"emitDeclarationOnly": true,
}
}
fruits/
apple.d.ts
apple.ts
vegetables/
zucchini.d.ts
zucchini.ts
소스 맵(source map) 출력 파일의 내용이 원본 소스 파일과 어떻게 일치하는지에 대한 설명입니다.
TypeScript 는 출력 파일과 함께 소스 맵을 출력하는 기능도 제공합니다.
tsc --sourceMap
fruits/
apple.js
apple.js.map
apple.ts
vegetables/
zucchini.js
zucchini.js.map
zucchini.ts
tsc --declarationMap
fruits/
apple.d.ts
apple.d.ts.map
apple.js
apple.ts
vegetables/
zucchini.d.ts
zucchini.d.ts.map
zucchini.js
zucchini.ts
tsc --noEmit
dom
과 target 컴파일러 옵션을 기본값으로 하는 문자열 배열을 사용합니다.dom
을 제거하기 위함입니다.tsc --lib es2020
// tsconfig.json
{
"complierOptions": {
"lib": ["es2020"]
}
}
dom
과 ECMAScript의 특정 버전
을 포함할 수 있습니다.tsc --lib dom,es2021
// tsconfig.json
{
"complierOptions": {
"lib": ["dom", "es2021"]
}
}
ES2020
까지만 지원하는 플랫폼에서 실행되는 lib이 "es2021"
로 설정된 프로젝트에서 String.replaceAll
과 같은 ES2021
이상에 정의된 API를 사용하려고 하면 런타임 오류가 발생할 수 있습니다.const value = "a b c";
// Uncaught TypeError: value.replaceAll is not a function
value.replaceAll(" ", ", ");
Tip
- lib 컴파일러 옵션은 내장된 언어 API를 나타내는 데 사용하고, target 컴파일러 옵션은 존재하는 구문 기능을 나타내는 데 사용한다고 생각하세요.
tsc --skipLibCheck
{
"complierOptions": {
"skipLibCheck": true
}
}
tsc --strict
// tsconfig.json
{
"complierOptions": {
"strict": true
}
}
tsc --strict --noImplicitAny false
// tsconfig.json
{
"complierOptions": {
"noImplicitAny": false,
"strict": true
}
}
any
타입으로 가정합니다. any
타입은 TypeScript의 타입 검사를 대부분 우회할 수 있으므로 이러한 암시적 타입을 허용하지 않는 것이 좋습니다.any
로 대체될 때 TypeScript에 타입 검사 오류가 발생하도록 지시합니다.// Error: Parameter 'message' implicitly has an 'any' value
const logMessage = (message) => {
console.log(`Message: ${message}!`);
}
// Ok
const logMessage = (message: string) => {
console.log(`Message: ${message}!`);
}
type LogsMessage = (message: string) => void;
const logMessage : LogsMessage = (message) => {
console.log(`Message: ${message}!`);
}
Function.apply
, Function.bind
, Function.call
함수 유틸리티를 나타낼 수 있을 만큼 충분한 타입 시스템 기능이 없었습니다.function getLength(text: string, trim?: boolean) {
return trim ? text.trim().length : text.length;
}
// 함수 타입 : (thisArg: Function, argArray?: any) => any
getLength.apply;
// 반환 타입 : any
getLength.bind(undefined, "abc123");
// 반환 타입 : any
getLength.call(undefined, "abc123", true);
이제 TypeScript의 타입 시스템 기능은 이러한 함수의 제네릭 나머지 인수를 나타내기에 충분히 강력하고 함수에 더 제한적인 타입 사용을 허용합니다.
strictBindCallApply를 활성화하면 getLength 함수 변형에 대해 훨씬 더 정확한 타입을 사용할 수 있습니다.
function getLength(text: string, trim?: boolean) {
return trim ? text.trim().length : text.length;
}
// 함수 타입 : (thisArg: typeof getLength, args: [text: string, trim?: boolean]) => number
getLength.apply;
// 반환 타입 : (trim?: boolean | undefined) => number
getLength.bind(undefined, "abc123");
// 반환 타입 : number
getLength.call(undefined, "abc123", true);
strictFunctionTypes
strictFunctionTypes 컴파일러 옵션은 함수 매개변수 타입을 약간 더 엄격하게 검사합니다.
다음 코드는 checkOnNumber 함수는 number | string를 매개변수로 받는 함수를 인수로 받아야 하지만, string만 매개변수로 받는 stringContainsA 함수를 인수로 받습니다.
function checkOnNumber(containsA: (input: number | string) => boolean) {
return containsA(1337);
}
function stringCountainsA(input: string) {
return !!input.match(/a/i);
}
checkOnNumber(stringContainsA);
TypeScript의 기본 검사는 checkOnNumber(stringContainsA)를 허용하고, 런타임에서 stringContainsA의 매개변수가 number인 경우 .match()를 호출하려고 하면 오류가 발생합니다.
strictFunctionTypes가 적용된 상태에서 checkOnNumber(stringContainsA)는 타입 검사 오류를 발생시킵니다.
checkOnNumber(stringContainsA);
// Error: Argument of type '(input: string) => boolean' is not assignable
// to paramter of type '(input: string | number) => boolean'.
// Types of parameters 'input' and 'input' are incompatible.
// Type 'string | number' is not assignable to type 'string'.
// Type 'number' is not assignable to type 'string'.
Note
- 기술적인 측면에서 함수 매개변수는 bivariant에서 contravariant로 전환됩니다.
- bivariant는 상위 타입과 하위 타입을 허용합니다.
- contravariant는 상위 타입을 허용하지만, 하위 타입은 허용하지 않습니다.
TypeScript의 strictNullChecks 플래그를 비활성화하면 코드의 모든 타입에 null | undefined
가 추가되고, 모든 변수가 null
또는 undefined
를 받을 수 있도록 허용합니다.
다음 코드에서 strictNullChecks를 활성화한 경우, string 타입인 value에 null
을 할당하면 타입 오류가 발생합니다.
let value: string;
// Ok
value = 'abc123';
// Error: Type 'null' is not assignable to type 'string'
value = null;
TypeScript의 strictPropertyInitialization 플래그는 초기화가 없고, 생성자에 확실하게 할당되지 않은 클래스 속성에서 타입 오류를 발생시킵니다.
TypeScript의 모범 사례는 strictPropertyInitialization를 활성화하는 것입니다.
any
타입을 제공합니다.any
에 의존하는 비용으로 오류 처리에 대한 유연성을 허용합니다.다음 코드의 error는 TypeScript가 someExternalFunction()에서 발생 가능한 모든 오류를 알 수 있는 방법이 없기 때문에 타입이 any
가 됩니다.
try {
someExternalFunction();
} catch (error) {
error; // 기본 타입 : any
}
any
사용과 마찬가지로 오류를 억지로 명시적 type assertion 또는 narrowing하는 비용보다 unknown
으로 처리하는 것이 기술적으로 타당합니다.any
또는 unknown
타입으로 annotation을 추가할 수 있습니다.try {
someExternalFunction();
} catch (error: unknown) {
error; // 기본 타입 : unknown
}
useUnknownInCatchVariables 플래그를 활성화하면, TypeScript의 기본 catch 절의 error 타입은 unknown
으로 설정됩니다.
TypeScript의 모범 사례는 useUnknownInCatchVariables를 활성화하는 것입니다.
AMD
, CommonJS
, ECMAScripts
등 모듈 내용을 내보내고 가져오기 위한 JavaScript의 다양한 시스템은 최신 프로그래밍 언어에서 가장 복잡한 모듈 시스템입니다.
TypeScript는 가장 합리적인 사용자 영역의 모듈 구성을 나타내는 구성 옵션을 제공하기 위해 최선을 다합니다.
ECMAScript
모듈 구문으로 작성됩니다.import { value } from "my-example-lib";
export const logValue = () => console.log(value);
TypeScript는 어떤 모듈 시스템으로 변환된 코드를 사용할지 결정하기 위해 module 컴파일러 옵션을 제공합니다.
ECMAScript
모듈로 소스 코드를 작성할 때 TypeScript는 module 값에 따라 export와 import 문을 다른 모듈 시스템으로 변환할 수 있습니다.예를 들어 다음 명령어를 실행하면, ECMAScript로 작성된 프로젝트를 CommonJS
모듈로 출력되도록 지시합니다.
tsc --module commonjs
CommonJS
모듈로 출력하도록 지시합니다.// tsconfig.json
{
"compilerOptions": {
"module": "commonjs"
}
}
const my_example_lib = require("my-example-lib");
exports.logValue = () => console.log(my_example_lib.value);
"es3"
또는 "es5"
인 경우 module 컴파일러 옵션의 기본값은 "commonjs"
가 됩니다."es2015"
로 기본 설정됩니다.모듈 해석(module resolution)은 import에서 가져온 경로가 moule에 매핑되는 과정입니다.
TypeScript는 해당 과정에 로직을 지정하는 데 사용할 수 있는 moduleResolution 옵션을 제공합니다.
일반적으로 다음 전략 중 하나를 제공하는 것을 선호합니다.
node
: 기존 Node.js와 같은 CommonJS resolver에서 사용하는 동작nodenext
: ECMAScript 모듈에 대해 지정된 동작에 맞게 조정bundler
: 최신 번들러에서 지정된 동작(a fusion of the ECMAScript module and CommonJS lookup rules in Node.js)에 맞게 조정 다음 명령을 실행하면, moduleResolution 컴파일러 옵션이 nodenext
로 지정됩니다.
tsc --moduleResolution nodenext
// tsconfig.json
{
"compilerOptions": {
"moduleResolution": "nodenext"
}
}
CommonJS
와 ECMAScript
모듈 내보내기 및 가져오기 형식구문 영역 | CommonJS | ECMAScript module |
---|---|---|
기본 내보내기 | module.exports.default = value; | export default value; |
기본 가져오기 | const { default: value } = require("...") | import value from "..." |
네임스페이스 내보내기 | module.exports = value; | 지원 안 함 |
네임스페이스 가져오기 | const value = require("..."); | import * as value from "..." |
TypeScript의 타입 시스템은 ECMAScript
모듈 측면에서 파일 가져오기와 내보내기에 대한 합의를 만듭니다.
CommonJS
모듈로 배포됩니다.ECMAScript
모듈 규칙을 준수하는 일부 패키지는 비록 기본 내보내기를 포함하지 않지만, 많은 개발자는 네임스페이스 가져오기보다 간결한 기본 가져오기를 선호합니다.TypeScript는 모듈 형식 간의 상호 운용성(interoperability)을 개선하는 몇 가지 컴파일러 옵션을 제공합니다.
esModuleInterop 구성 옵션은 module이 "es2015"
또는 "esnext
"와 같은 ECMAScript
모듈 형식이 아닌 경우, TypeScript에서 내보낸 JavaScript 코드에 소량의 로직을 추가합니다.
ECMAScript
모듈이 기본 또는 네임스페이스 가져오기에 대한 ECMAScript
모듈의 규칙을 준수하지 않은 경우에도 모듈에서 가져올 수 있도록 합니다.esModuleInterop을 활성화하는 이유 중 하나는 기본 내보내기를 제공하지 않는 "react"같은 패키지를 위해서 입니다.
import React from "react";
// Error: Module '"file:///node_modules/@types/react/index"' can
// only be default-imported using the 'esModuleInterop' flag.
allowSyntheticDefaultImports 컴파일러 옵션은 타입 시스템에 가져오기 상호 운용성을 알리는 옵션입니다.
ECMAScript
모듈이 호환되지 않는 CommonJS
네임스페이스 내보내기 파일에서 기본 가져오기를 할 수 있음을 타입 시스템에 알립니다.allowSyntheticDefaultImports 옵션은 다음 중 하나가 true인 경우 true로 기본적으로 설정됩니다.
" system"
인 경우"es2015"
또는 "esnext"
와 같은 ECMAScript
가 아닌 경우bundler
인 경우esModuleInterop이 true이지만 module이 "esnext"
인 경우, TypeScript는 컴파일된 출력 JavaScript 코드가 가져오기 상호 운용성 지원을 사용하지 않는다고 가정합니다.
import React from "react"
// Error: Module '"file:///node_modules/@types/react/index"' can
// only be default-imported using the 'allowSyntheticDefaultImports' flag.
// index.ts
import { value } from "./values";
console.log(`Quote: '${value.toUpperCase()}'`);
// values.js
export const value = "We cannot succeed when half of us are held back.";
allowJs를 활성화하지 않으면 import 문은 알려진 타입을 갖지 못합니다.
any
가 되거나 "Could not find a declaration file for module './values'."
와 같은 타입 오류가 발생합니다.allowJs는 ECMAScript target에 맞게 컴파일되고 JavaScript로 내보내진 파일 목록에 JavaScript 파일을 추가합니다.
allowJs 옵션이 활성화된 경우 소스 맵과 선언 파일도 생성됩니다.
tsc --allowJs
// tsconfig.json
{
"compilerOptions": {
"allowJs": true
}
}
checkJs 컴파일러 옵션은 다음 2 가지 용도로 사용됩니다.
checkJs를 활성화하면 TypeScript가 JavaScript 파일을 TypeScript 관련 구문이 없는 TypeScript 파일인 것처럼 처리합니다.
tsc --checkJs
// tsconfig.json
{
"compilerOptions": {
"checkJs": true
}
}
// index.js
let myQuote = "Each person must live their life as a model for others.";
console.log(quote);
// Error: Cannot find name 'quote'. Did you mean 'myQuote'?
// index.js
// @ts-check
let myQuote = "Each person must live their life as a model for others.";
console.log(quote);
// Error: Cannot find name 'quote'. Did you mean 'myQuote'?
allowJs와 checkJs가 활성화되면 TypeScript는 코드의 모든 JSDocs 정의를 인식합니다.
다음 코드에서 string 타입을 받는 sentenceCase 함수에 대한 JSDoc을 선언하고, allowJs와 checkJs를 활성화합니다.
// index.js
/**
* @param {string} text
*/
function sentenceCase(text) {
return `${text[0].toUpperCase()} ${text.slice(1)}`;
}
sentenceCase("hello world"); // Ok
sentenceCase(["hello", "world"]);
// Error: Argument of type 'string[]' is not assignable to parameter of type 'string'.
TSConfig는 extends 구성 옵션을 사용해 다른 TSConfig에서 확장할 수 있습니다.
extends는 다른 TSConfig 파일에 대한 경로를 가져오고 해당 파일의 모든 설정을 복사해야 함을 나타냅니다.
예를 들어 여러 개의 packages/* 디렉터리를 포함하는 모노레포처럼 여러 개의 TSConfig가 있는 많은 저장소는 확장할 tsconfig.json 파일에 대한 tsconfig.base.json 파일을 생성합니다.
// tsconfig.base.json
{
"complierOptions": {
"strict": true
}
}
// packages/core/tsconfig.json
{
"extends": "../../tsconfig.base.json",
"includes": ["src"]
}
complierOptions는 재귀적으로 고려됩니다.
allowJs 옵션을 추가하는 파생된 TSConfig는 여전히 기본 TSConfig의 컴파일러 옵션인 complierOptions.strict가 true로 설정됩니다.
// packages/core/tsconfig.json
{
"extends": "../../tsconfig.base.json",
"complierOptions": {
"allowJs": true
},
"includes": ["src"]
}
extends 속성은 다음 JavaScript 가져오기 중 하나를 사용합니다.
extends 값이 절대 경로라면 npm 모듈에서 TSConfig를 확장함을 나타냅니다.
해당 패키지의 package.json은 상대 경로 문자열이 있는 "tsconfig" 필드를 포함하고, 해당 경로의 TSconfig 파일이 사용됩니다.
많은 조직에서 npm 패키지을 사용해 여러 저장소 또는 모노레포 내에서 TypeScript 컴파일러 옵션을 표준화합니다.
다음 TSConfig 파일은 @my-org 조직의 모노레포에 대해 설정하는 파일입니다.
// packages/tsconfig.json
{
"complierOptions": {
"strict": true
}
}
// packages/js/tsconfig.json
{
"extends": "@my-org/tsconfig",
"complierOptions": {
"strict": true
},
"includes": ["src"]
}
// packages/ts/tsconfig.json
{
"extends": "@my-org/tsconfig",
"includes": ["src"]
}
처음부터 고유한 구성을 생성하거나 --init
제안을 하는 대신, 특정 런타임 환경에 맞게 미리 만들어진 base TSConfig 파일로 시작할 수 있습니다.
예를 들어 deno에서 권장하는 base TSConfig 파일을 설치하려면 다음과 같이 진행합니다.
npm install --save-dev @tsconfig/deno
# or
yarn add --dev @tsconfig/deno
{
"extends": "@tsconfig/deno/tsconfig.json"
}
대규모 프로젝트에서 프로젝트의 서로 다른 영역에 서로 다른 구성 파일을 사용하는 것이 유용할 수 있습니다.
TypeScript에서는 여러 개의 프로젝트를 함께 빌드하는 프로젝트 레퍼런스(project reference) 시스템을 정의할 수 있습니다.
프로젝트 레퍼런스 설정 작업은 단일 TSConfig 파일을 사용하는 것보다 조금 더 작업이 많지만 몇 가지 핵심 이점이 있습니다.
프로젝트 레퍼런스를 활성화하기 위해 프로젝트 설정을 구축하는 방법을 소개합니다.
TypeScript는 프로젝트에서 composite 구성 옵션을 선택해 파일 시스템 입력과 출력이 제약 조건을 준수함을 나타냅니다.
composite이 true일 때는 다음과 같습니다.
다음 코드는 core/ 디렉터리에서 composite 모드를 활성화하기 위한 모든 조건과 일치합니다.
// core/tsconfig.json
{
"complierOptions": {
"declaration": true
},
"composite": true
}
TypeScript 프로젝트는 TSConfig에 references 설정이 있는 복합 TypeScript 프로젝트에서 생성된 출력에 의존함을 나타낼 수 있습니다.
다음 코드는 /core 디렉터리를 입력으로 참조하도록 shell/ 디렉터리를 설정합니다.
// shell/tsconfig.json
{
"references": [
{ "path": "../core" }
]
}
Note
- references 구성 옵션은 기본 TSConfig 옵션에서 extends를 통해 파생된 TSConfig로 복사되지 않습니다.
코드 영역이 프로젝트 레퍼런스를 사용할 수 있도록 한번 설정되면 빌드(build) 모드에서 -b 또는 --b CLI 플래그를 통해 tsc를 사용할 수 있습니다.
TypeScript의 빌드 모드는 TSConfig가 제공될 때 다음 내용을 수행합니다.
TypeScript 빌드 모드 기능은 최신 프로젝트를 다시 빌드하는 것을 건너뛰도록 해 빌드 성능을 크게 향상시킵니다.
저장소에서 TypeScript 프로젝트 레퍼런스를 설정하는 편리한 방법은 빈 파일 배열과 저장소의 모든 프로젝트 레퍼런스에 대한 레퍼런스를 사용해 최상위 레벨의 tsconfig.json을 설정하는 것입니다.
다음 tsconfig.json은 저장소의 packages/core와 packages/shell 프로젝트를 빌드하는 것을 나타냅니다.
// tsconfig.json
{
"files": [],
"references": [
{ "path": "./packages/core" },
{ "path": "./packages/shell" }
]
}
tsc -b
를 바로 호출하는 build 또는 complie이라는 이름의 스크립트를 표준화해서 사용할 수 있습니다.// package.json
{
"scripts": {
"build": "tsc -b"
}
}
빌드 모드는 몇 가지 빌드에 특화된 CLI 옵션을 지원합니다.
빌드 모드는 watch 모드를 지원하기 때문에 tsc b -w
같은 명령을 실행하면 대규모 프로젝트에서 모든 컴파일러 오류에 대한 최신 목록을 빠르게 확인할 수 있습니다.