TypeScript 공식 문서: 개념, 예제, 실습
예제 중심의 간결한 TypeScript 레퍼런스. 개념을 읽고 코드를 본 뒤 Coddy 여정에서 직접 연습하세요.
TypeScript 가이드 학습 시작하기시작하기
- 타입스크립트란타입스크립트란 정적 타입을 더한 JavaScript입니다. 값에 타입을 붙이면 코드가 실행되기 전에 컴파일러가 검사하고, 결과물은 브라우저나 Node.js, Deno, Bun에서 실행되는 평범한 JavaScript입니다.
- TypeScript vs JavaScriptTypeScript는 코드가 실행되기 전에 검사되는 정적 타입 시스템을 JavaScript에 더한 언어입니다. 문법, 타입 검사기가 잡아내는 것, 빌드 단계, 실행 속도, 학습 난이도, JavaScript 프로젝트를 옮기는 방법을 나란히 비교합니다.
- TypeScript 설치npm으로 TypeScript를 프로젝트의 개발 의존성으로 설치하고, npx tsc --version으로 버전을 확인하고, tsc --init으로 tsconfig.json을 만들고, 첫 파일을 컴파일합니다. 전역 설치, pnpm, Yarn, Bun, 그리고 자주 만나는 오류도 다룹니다.
- TypeScript 실행.ts 파일을 실행하는 다섯 가지 방법: tsc로 컴파일해서 JavaScript를 실행하기, node file.ts로 바로 실행하기(타입 제거), tsx나 ts-node 쓰기, Deno와 Bun 쓰기. 어느 것이 타입을 검사하는지, 각각 어떤 문법을 지원하는지, 무엇을 고를지 알아봅니다.
- tsconfig.jsontsconfig.json은 폴더를 TypeScript 프로젝트로 표시하고 컴파일러 옵션을 정합니다. 중요한 옵션(target, module, moduleResolution, strict, rootDir, outDir, include, lib, types, noEmit, skipLibCheck), 권장 시작 설정, extends, 그리고 TypeScript 7에서 바뀐 점을 정리합니다.
- TypeScript 7TypeScript 7은 TypeScript 컴파일러를 Go로 다시 작성한 네이티브 프로그램입니다. 약 10배 빠르고, tsc 명령과 언어는 그대로입니다. 사용자에게 바뀐 점(새 기본값, 제거된 옵션, 없어진 JavaScript API), 아직 TypeScript 6이 필요한 도구, 업그레이드 방법을 알아봅니다.
- 주석TypeScript는 JavaScript의 // 주석과 /* */ 주석, 그리고 에디터가 마우스를 올렸을 때 보여 주는 JSDoc /** */ 주석을 씁니다. 또한 @ts-expect-error, @ts-ignore, @ts-nocheck, @ts-check, /// <reference> 지시문 같은 특수 주석 몇 가지를 읽습니다.
- TypeScript vs PythonTypeScript와 Python은 둘 다 가비지 컬렉션을 쓰는 고수준 언어지만, TypeScript는 코드가 실행되기 전에 타입을 검사하고 Python의 타입 힌트는 선택 사항이며 런타임에 무시됩니다. 타입, 런타임, 속도, 생태계, 용도를 같은 프로그램으로 나란히 비교합니다.
기본 타입
- 기본 타입TypeScript의 내장 타입인 string, number, boolean, bigint, symbol, null, undefined와 배열, 객체 타입을 한눈에 정리합니다. 타입 표기(annotation) 작성법, 정수 타입이 없는 이유, String 대신 string을 쓰는 이유를 알아봅니다.
- 타입 추론TypeScript는 작성한 값에서 대부분의 타입을 알아냅니다. 변수, let과 const, 객체, 배열, 반환값에 대해 무엇이 추론되는지, 콜백이 문맥에서 타입을 얻는 방식, 그리고 여전히 타입 표기가 필요한 곳을 알아봅니다.
- 문자열TypeScript에서 문자열 다루기: 템플릿 리터럴로 문자열 보간하기, 여러 줄 문자열, 문자열에 특정 문자열이 포함됐는지 확인하기, 자주 쓰는 메서드와 반환 타입, 문자열 리터럴 타입.
- 문자열 숫자 변환TypeScript에서 Number(), parseInt(), parseFloat(), 단항 +로 문자열을 숫자로 변환하는 방법과, 각 방법이 "42px", "", "1e3" 같은 입력을 어떻게 처리하는지, NaN을 안전하게 확인하는 법, 숫자를 다시 문자열로 바꾸는 법을 알아봅니다.
- 배열TypeScript에서 배열에 타입을 지정하는 방법: T[]와 Array<T>, 객체 배열, 여러 타입을 담는 배열, readonly 배열, 그리고 map, filter, reduce, find가 반환하는 타입. 리터럴 배열에서 includes를 쓸 때의 함정도 다룹니다.
- 튜플TypeScript 튜플은 [string, number]처럼 요소 개수가 고정되고 위치마다 타입이 정해진 배열입니다. 문법, 이름 붙은 요소, 선택 요소, 나머지 요소, readonly 튜플과 as const, 함수에서 튜플 반환하기, 튜플과 배열의 차이를 알아봅니다.
- 객체 타입TypeScript에서 객체에 타입을 지정하는 방법: 인라인 객체 타입, ?를 쓴 선택적 프로퍼티, readonly 프로퍼티, 중첩 객체, 메서드, 초과 프로퍼티 검사, 그리고 object, {}, Object의 차이를 알아봅니다.
- enum(열거형)TypeScript enum은 enum Direction { Up, Down }처럼 이름 붙은 상수의 집합입니다. 숫자 enum과 문자열 enum, enum이 컴파일되는 JavaScript, 역방향 매핑, enum 순회, const enum, 그리고 문자열 리터럴 유니언이나 as const 객체가 더 나은 경우를 알아봅니다.
특수 타입
- 리터럴 타입리터럴 타입은 "GET"이나 404처럼 값이 딱 하나인 타입입니다. 문자열, 숫자, 불리언 리터럴 타입, 리터럴 유니언, let은 넓어지고 const는 넓어지지 않는 이유, as const가 하는 일, const 타입 매개변수를 알아봅니다.
- any vs unknownany와 unknown은 둘 다 모든 값을 받습니다. any는 그 값의 타입 검사를 끄고, unknown은 값을 쓰기 전에 확인하게 만듭니다. 둘의 차이, unknown을 좁히는 방법, noImplicitAny, 타입이 있는 코드에 any가 몰래 끼어드는 곳을 알아봅니다.
- never 타입never는 값이 하나도 없는 타입입니다. 끝나지 않는 함수의 반환 타입이고, 좁히기가 모든 경우를 배제한 뒤 남는 타입이며, switch 완전성 검사를 가능하게 하는 도구입니다. never가 어디서 생기는지, void와 어떻게 다른지 알아봅니다.
- null과 undefinedstrictNullChecks가 켜져 있으면 null과 undefined는 별도의 타입이고 TypeScript는 이를 처리하게 만듭니다. null과 undefined를 확인하는 방법, 옵셔널 체이닝(?.), 물음표 두 개(??)와 ??=, 선택적 속성과 | undefined의 차이를 알아봅니다.
- non-null 단언(!)user!처럼 값 뒤에 붙은 느낌표는 non-null 단언 연산자입니다. 런타임 검사 없이 타입에서 null과 undefined를 없앱니다. x!가 하는 일, 확정 할당 형태인 let x!: T와 prop!: T, 이것이 위험한 이유, 더 안전한 대안을 알아봅니다.
인터페이스와 타입 별칭
- interface(인터페이스)interface는 객체의 모양, 즉 어떤 속성이 있고 각각 어떤 타입인지에 이름을 붙입니다. 선언 방법, 선택적 속성과 readonly 속성, 메서드, 인덱스 시그니처, 확장, 클래스에서 구현하기, 선언 병합, 제네릭 인터페이스, 인터페이스에 기본값을 주는 방법을 알아봅니다.
- type 별칭타입 별칭은 type 키워드로 어떤 타입에든 이름을 붙입니다. 객체 모양, 유니언, 튜플, 함수, 제네릭, 재귀 타입까지요. 문법, 각 형태의 모습, 그리고 별칭이 새롭고 별개인 타입이 아니라 이름일 뿐인 이유를 알아봅니다.
- interface vs typeinterface와 type은 둘 다 객체 모양을 기술할 수 있고, 대부분의 경우 어느 쪽이든 동작합니다. 실제 차이인 선언 병합, 유니언과 매핑된 타입, extends와 교차 타입, 암묵적 인덱스 시그니처, 오류 보고와 컴파일러 성능, 그리고 명확한 선택 기준을 알아봅니다.
- extends 키워드extends 키워드는 한 타입으로 다른 타입을 만듭니다. 인터페이스를 (하나 또는 여러 개에서) 확장하는 방법, &로 타입 별칭을 확장하는 방법, 속성 타입 재정의, Omit으로 속성 바꾸기, 그리고 클래스, 제네릭 제약, 조건부 타입에서 extends가 뜻하는 것을 알아봅니다.
- 유니언 타입string | number 같은 유니언 타입은 값이 여러 타입 중 하나일 수 있다는 뜻입니다. 유니언으로 할 수 있는 것(모든 멤버가 지원하는 것만), 유니언을 좁히는 방법, 리터럴과 객체 타입의 유니언, (A | B)[]와 A[] | B[]의 차이를 알아봅니다.
- 교차 타입교차 타입 A & B는 동시에 A이면서 B인 값을 기술하므로 양쪽의 모든 멤버를 갖습니다. &로 객체 타입을 합치는 방법, 충돌하는 속성이 never가 되는 이유, 유니언의 교차가 공통 멤버만 남기는 방식, 대신 extends를 써야 할 때를 알아봅니다.
- 판별 유니언판별 유니언은 kind나 status 같은 리터럴 태그 속성을 공유하는 객체 타입의 유니언입니다. 태그를 확인하면 객체 전체가 좁혀집니다. 패턴, switch 좁히기, never로 하는 완전성 검사, API 결과, 요청 상태, 상태 머신을 모델링하는 방법을 알아봅니다.
함수
- 함수TypeScript에서 함수에 타입을 붙이는 방법: 모든 매개변수에 타입을 표기하고, 반환 타입은 표기하거나 추론에 맡기고, 아무것도 반환하지 않는 함수에는 void를 쓰고, 화살표 함수, 함수 표현식, async 함수, this 매개변수에 타입을 붙입니다.
- 함수 타입TypeScript에서 함수의 타입을 쓰는 방법: 화살표 문법 (a: number) => string, 함수를 위한 타입 별칭, 화살표 함수와 콜백의 타입, 호출 시그니처와 생성 시그니처, 그리고 Function 타입이 너무 느슨한 이유를 알아봅니다.
- 선택적 매개변수TypeScript 매개변수를 ?로 선택적으로 만들거나, 기본값을 주거나, 나머지 매개변수로 인수를 몇 개든 모읍니다. 순서 규칙, 생략과 undefined의 차이, 옵션 객체, 함수 타입의 선택적 매개변수를 다룹니다.
- 함수 오버로딩TypeScript 함수 오버로드는 함수 하나에 각자 반환 타입을 가진 여러 호출 시그니처를 줍니다. 오버로드 시그니처와 구현의 패턴, 컴파일러가 검사하는 규칙, 유니언 매개변수가 더 나은 경우, 클래스의 오버로드를 알아봅니다.
타입 좁히기와 검사
- 타입 좁히기좁히기는 TypeScript가 if, switch 안에서, 또는 early return 뒤에 string | number 같은 넓은 타입을 구체적인 타입으로 바꾸는 방식입니다. typeof, 참 같은 값 검사, 동등 비교, in, instanceof, 대입, 타입 서술어, 판별 유니언까지 모든 좁히기 형태를 한곳에 정리합니다.
- typeof 연산자TypeScript에서 typeof는 두 가지 일을 합니다. 코드에서는 런타임에 "string", "number", "object" 등을 반환하는 JavaScript 연산자이고, TypeScript는 이를 보고 타입을 좁힙니다. 타입에서는 keyof typeof obj나 ReturnType<typeof fn>처럼 변수의 타입을 복사하는 타입 쿼리입니다.
- instanceof 연산자instanceof는 객체가 어떤 클래스로 만들어졌는지 런타임에 확인하고, TypeScript는 변수를 그 클래스로 좁힙니다. 직접 만든 클래스와 Error 하위 클래스에서의 동작, 인터페이스나 타입 별칭을 확인할 수 없는 이유, 의외의 답을 주는 경우를 알아봅니다.
- 타입 가드타입 가드는 TypeScript가 이해하는 런타임 검사입니다. 내장 가드, value is Type 서술어로 직접 만드는 방법, 객체가 어떤 타입인지 확인하는 방법, asserts를 쓰는 단언 함수, unknown 데이터를 검증하는 방법을 알아봅니다.
- 타입 단언as 키워드는 값을 다른 타입으로 취급하라고 TypeScript에 알립니다. 캐스트가 아닙니다. 런타임에 아무것도 변환하거나 검사하지 않습니다. as와 꺾쇠괄호 문법, 컴파일러가 허용하는 것, unknown을 거치는 이중 단언, 타입 가드가 더 나은 도구인 경우를 알아봅니다.
- satisfies 연산자satisfies 연산자는 값이 타입에 맞는지 검사하면서 값의 추론된 타입은 바꾸지 않습니다. 무엇을 하는지, 타입 표기와 as와 어떻게 다른지(같은 객체를 세 가지로 작성), as const와 어떻게 조합하는지, 왜 설정 객체에 잘 맞는지 알아봅니다.
클래스
- 클래스TypeScript 클래스는 필드, 메서드, 생성자에 타입을 붙인 JavaScript 클래스입니다. 필드 선언과 strictPropertyInitialization의 동작, this의 타입, getter와 setter, 정적 멤버, implements, 그리고 클래스가 타입으로도 쓰이는 방식을 알아봅니다.
- 생성자TypeScript에서 클래스 생성자에 타입을 붙이는 방법: 타입이 있는 매개변수와 선택적 매개변수, constructor(private name: string) 같은 매개변수 속성, 필드 초기화 순서, 생성자 오버로드, 하위 클래스의 super 호출, private 생성자, new를 쓰는 생성자 타입을 알아봅니다.
- 접근 제한자TypeScript에는 세 가지 접근 제한자 public, private, protected와 readonly가 있습니다. 각각이 허용하는 것, TypeScript의 private는 컴파일 시점 검사인 반면 JavaScript의 #private 필드는 런타임에 강제되는 이유, 무엇을 고를지 알아봅니다.
- 상속TypeScript의 클래스 상속: extends와 super, 호환되는 타입으로 메서드 재정의, override 키워드와 noImplicitOverride, protected 멤버, declare로 필드 다시 선언하기, 그리고 implements가 더 나은 도구인 경우를 알아봅니다.
- 추상 클래스TypeScript의 추상 클래스는 인스턴스를 만들 수 없고 메서드 구현을 하위 클래스에 맡길 수 있는 기반 클래스입니다. 추상 메서드와 추상 속성, 템플릿 메서드 패턴, 추상 생성자 타입, 인터페이스가 더 나은 선택인 경우를 알아봅니다.
- 데코레이터데코레이터는 @ 문법으로 클래스 멤버를 감싸거나 대체하는 함수입니다. TypeScript가 플래그 없이 지원하는 표준 데코레이터(클래스, 메서드, getter, 필드, accessor), 데코레이터 팩토리, addInitializer, 그리고 Angular와 NestJS가 쓰는 레거시 experimentalDecorators와의 차이를 알아봅니다.
제네릭
- 제네릭제네릭은 함수, 인터페이스, 타입, 클래스가 여러 타입과 함께 동작하면서도 그 관계를 유지하게 합니다. 들어가는 것이 나오는 것을 정합니다. 제네릭 함수, 타입 인수 추론, 여러 타입 매개변수, 제네릭 인터페이스와 클래스, 기본값, 그리고 제네릭을 쓰지 말아야 할 때를 알아봅니다.
- 제네릭 제약제네릭 제약 T extends Something은 타입 매개변수가 받는 타입을 제한하고, 함수가 제약이 보장하는 것을 쓸 수 있게 합니다. 객체 모양과 인터페이스에 대한 extends, 안전한 속성 접근을 위한 K extends keyof T, 원시 타입에 대한 제약, 그리고 만나게 될 오류를 다룹니다.
타입 연산자
- keyof 연산자keyof는 객체 타입을 받아 속성 이름들의 유니언을 줍니다. 인터페이스와 keyof, 평범한 객체를 위한 keyof typeof, 제네릭으로 타입이 있는 속성 접근, 인덱스 시그니처(string | number), 그리고 Object.keys가 string[]를 반환하는 이유를 알아봅니다.
- 인덱스 접근 타입인덱스 접근 타입은 다른 타입에서 속성의 타입을 읽어 옵니다. Person["age"]는 number입니다. T["key"], 유니언 키, T[keyof T], 배열 요소를 위한 T[number], 튜플 인덱스, const 배열을 유니언으로 바꾸는 (typeof arr)[number]를 알아봅니다.
- 매핑된 타입매핑된 타입은 키를 순회하며 새 객체 타입을 만듭니다: { [K in keyof T]: ... }. 문법, +와 -를 쓰는 readonly와 ? 제한자, as로 하는 키 재매핑, 키 걸러 내기, 그리고 Partial, Readonly, Required, Pick, Record가 작성된 방식을 알아봅니다.
- 조건부 타입조건부 타입은 검사에 따라 두 타입 중 하나를 고릅니다: T extends U ? X : Y. 문법, 조건부 타입이 유니언에 분배되는 방식(과 그것을 멈추는 방법), infer로 타입 추출하기, ReturnType을 직접 작성하는 방법을 알아봅니다.
- 템플릿 리터럴 타입템플릿 리터럴 타입은 JavaScript 템플릿 문자열과 같은 백틱 문법으로 문자열 리터럴 타입을 만듭니다: `on${Capitalize<E>}`. 문법, 유니언이 곱해지는 방식, Uppercase와 Capitalize, `${number}px` 같은 패턴, 매핑된 타입으로 만드는 getter, infer로 문자열 파싱하기를 알아봅니다.
- 브랜드 타입브랜드 타입은 string & { readonly __brand: "UserId" }처럼 보이지 않는 태그를 붙인 원시 타입으로, OrderId가 필요한 곳에 UserId를 넘기지 못하게 합니다. 브랜드의 동작 원리, 검증하는 생성 함수, 제네릭 Brand 헬퍼, unique symbol 브랜드, 브랜드 숫자를 알아봅니다.
유틸리티 타입
- 유틸리티 타입TypeScript에 내장된 유틸리티 타입을 한곳에 모았습니다. Partial, Required, Readonly, Pick, Omit, Record, Exclude, Extract, NonNullable, Parameters, ReturnType, Awaited, 문자열 타입 등 각각 한 줄 설명과 실행 가능한 예제를 담았습니다.
- RecordRecord<K, V>는 키가 K이고 값이 모두 V인 객체 타입입니다. 문자열 키와 유니언 키(모든 키가 필수)로 쓰는 Record, Partial<Record>, 타입이 지정된 키로 Record 순회하기, 없는 키 함정, 인덱스 시그니처나 Map을 써야 할 때를 알아봅니다.
- Partial과 RequiredPartial<T>는 T의 모든 속성을 선택적으로 만들며, 업데이트나 패치 객체의 타입으로 딱 맞습니다. 업데이트 함수에서 Partial 쓰기, Partial이 얕은 이유, DeepPartial 만들기, 명시적 undefined 함정, 그리고 반대인 Required<T>를 알아봅니다.
- OmitOmit<T, K>는 T의 속성 중 키 K를 뺀 나머지로 타입을 만듭니다. 키 하나와 여러 개 제외하기, 속성 타입 덮어쓰기, 런타임에 속성 제거하기, Omit과 Exclude, Pick의 차이, Omit이 없는 키를 받는 이유, 엄격한 Omit, 유니언 타입에서의 Omit을 알아봅니다.
- PickPick<T, K>는 T의 속성 중 키가 K에 있는 것만으로 타입을 만듭니다. 키 하나와 여러 개 고르기, 키 검사 방식, Pick과 Omit의 차이, 중첩 타입에서 고르기, 타입이 지정된 pick() 함수, 값 타입으로 속성 고르기를 알아봅니다.
- readonly와 Readonlyreadonly 수정자와 Readonly<T> 유틸리티 타입은 코드가 속성을 다시 대입하지 못하게 막습니다. readonly 속성과 클래스 필드, Readonly<T>, 읽기 전용 배열(readonly T[]와 ReadonlyArray), ReadonlyMap과 ReadonlySet, readonly가 얕고 컴파일 타임에만 동작하는 이유, Object.freeze와 as const와의 비교를 알아봅니다.
- Exclude와 ExtractExclude, Extract, NonNullable은 유니언 타입의 멤버를 걸러냅니다. 각각 무엇을 남기고 무엇을 제거하는지, 모양으로 유니언 멤버를 고르는 방법, 조건부 타입으로 만들어진 원리, Omit, Pick과의 차이를 알아봅니다.
- ReturnType과 ParametersReturnType, Parameters, ConstructorParameters, InstanceType, Awaited는 함수, 클래스, Promise에서 타입을 뽑아냅니다. typeof와 함께 쓰는 방법, async 함수의 결과 타입 얻기, 오버로드와 제네릭에서 일어나는 일, infer로 ReturnType을 만드는 방법을 알아봅니다.
반복문과 컬렉션
- 반복문TypeScript의 모든 반복 방법과 각각이 주는 타입: 기본 for 문, 배열과 Map, 문자열을 도는 for...of, 문자열 키를 주는 for...in, forEach(break도 await도 안 됨), 객체 키를 타입 안전하게 순회하기, while.
- switch 문TypeScript의 switch 문: 문법, 각 case에서 유니언 타입이 좁혀지는 방식, case가 빠지면 컴파일되지 않는 전수 검사(exhaustive) switch, switch (true) 패턴, fallthrough와 블록 스코프.
- MapTypeScript에서 Map 사용하기: 타입이 지정된 Map<K, V> 만들기, get이 V | undefined를 반환하는 이유, set, has, delete, 삽입 순서대로 순회하기, 객체 키, 객체와 JSON으로 변환하기, Map과 객체와 Record 비교, array.map()의 타입.
- 딕셔너리TypeScript에는 딕셔너리나 해시맵 클래스가 없습니다. 키와 값의 조회 구조는 인덱스 시그니처, Record<K, V>, Map<K, V>로 타입을 지정합니다. 각각의 사용법, 키가 있는지 확인하는 방법, 추가, 삭제, 순회, 그리고 딕셔너리에서 noUncheckedIndexedAccess가 중요한 이유를 알아봅니다.
비동기와 오류
- PromiseTypeScript에서 Promise에 타입을 붙이는 방법을 다룹니다. Promise<T> 타입, new Promise와 resolve의 타입 지정, then이 타입을 바꾸는 방식, catch에서 any가 나오는 이유, 튜플 결과를 주는 Promise.all, Promise.allSettled의 결과 타입, 콜백 API를 타입이 있는 Promise로 감싸기를 알아봅니다.
- async/awaitTypeScript에서 async와 await의 타입을 다룹니다. async 함수는 Promise<T>를 반환하고, await는 이를 풀며, 에러는 try/catch로 잡고, 최상위 await에는 ES 모듈이 필요합니다. 하나씩 await하기와 병렬로 await하기의 차이, forEach 함정도 알아봅니다.
- 에러 처리TypeScript의 에러 처리를 다룹니다. catch 변수가 unknown인 이유, instanceof Error로 좁히는 방법, 에러 던지기, name과 cause를 가진 사용자 정의 에러 클래스 작성, 예상되는 에러를 위한 Result 타입 패턴을 알아봅니다.
- sleep(대기)TypeScript에는 내장 sleep이 없지만 한 줄이면 만들 수 있습니다. setTimeout으로 이행되는 Promise<void>를 반환하는 함수입니다. 이를 await하는 방법, 루프 안에서 멈추기, 지연 후 재시도하기, sleep 취소하기, JavaScript에 블로킹 sleep이 없는 이유를 알아봅니다.
모듈과 도구
- 모듈최상위에 import나 export가 있는 TypeScript 파일은 모두 모듈입니다. named export와 default export, import type과 export type, module 설정이 ES 모듈과 CommonJS 출력 중 무엇을 고르는지, node16과 nodenext에서 import에 .js 확장자가 필요한 이유를 알아봅니다.
- 네임스페이스TypeScript namespace는 값과 타입을 하나의 이름 아래 묶고 평범한 객체로 컴파일됩니다. 문법, 네임스페이스끼리 또는 함수, 클래스와 병합되는 방식, ES 모듈이 네임스페이스를 대체한 이유, 그리고 아직 네임스페이스를 만나는 곳인 선언 파일과 전역 확장을 알아봅니다.
- 선언 파일.d.ts 파일은 JavaScript 코드의 타입만 기술하고 코드는 담지 않으며, declare 키워드는 .ts 파일 안에서 같은 일을 합니다. 선언 파일이 생성되는 방식, @types 패키지의 역할, 타입이 없는 모듈에 타입을 주는 방법, declare global과 모듈 보강(module augmentation)으로 기존 타입을 확장하는 방법을 알아봅니다.
- strict 모드tsconfig.json의 strict: true는 noImplicitAny, strictNullChecks, strictPropertyInitialization을 비롯한 타입 검사 옵션 묶음을 켭니다. 각 옵션이 잡아내는 것, 기존 프로젝트에 strict 모드를 적용하는 방법, strict에 포함되지 않는 유용한 옵션을 알아봅니다.
- JSONJSON.parse는 any를 반환하므로 TypeScript는 결과에 붙인 타입을 그대로 믿습니다. 파싱한 JSON에 타입을 지정하는 방법, 타입 가드로 검증하기, JSON 샘플을 인터페이스로 바꾸기, .json 파일 import하기, JSON.stringify가 Date, Set, undefined를 어떻게 처리하는지 알아봅니다.
더 나아가기
- 베스트 프랙티스실제 버그를 막아 주는 TypeScript 습관 8가지: strict 유지하기, any 대신 unknown 쓰기, 추론에 맡기기, enum보다 유니언, satisfies로 설정 검사하기, 판별 유니언으로 상태 모델링하기, !와 as 피하기, 데이터를 readonly로 만들기. 각각 실행 가능한 전후 비교 예제가 있습니다.
- 면접 질문짧고 정확한 답과 코드로 정리한 TypeScript 면접 질문 25개를 초급부터 고급까지 묶었습니다: any와 unknown, interface와 type, 제네릭, 타입 좁히기, 유틸리티 타입, 매핑된 타입과 조건부 타입, 구조적 타이핑, tsconfig, TypeScript 7.