TypeScript 빠른 참조 — 간결한 참고서
TypeScript 5 문법, 타입 시스템과 가장 자주 쓰는 관용 표현의 빠른 참조 매뉴얼로, 일상 시나리오의 약 80%를 다룹니다.
TypeScript TypeScript 5.x
ECMAScript + 타입 · 다중 패러다임 · 구조적 · 정적(점진적) 타입 · JS 기반
추천 학습 경로
먼저 컴파일 환경(tsc/tsconfig)을 설정하고 TS가 JS의 상위 집합임을 이해함 → 기본 타입 표기, 유니온 타입과 인터페이스 마스터 → 타입 시스템 심화(제네릭, 타입 가드, 타입 조작) → class와 모듈로 코드 조직화 → 비동기와 DOM/Node 타입 처리 → 마지막으로 필요에 따라 빌드 설정, 테스트, 디버깅을 조회. FAQ 섹션은 나중에 돌아와 함정을 피할 때 적합함.
1.Hello World와 빌드 환경
TypeScript를 빌드하고 실행하며, tsc, tsconfig, 그리고 타입 검사 흐름을 이해한다.
최소 프로그램
TS는 JS의 상위 집합이다. 합법적인 JS는 모두 합법적인 TS이며, 타입 표기를 추가한 뒤 tsc로 컴파일하면 JS가 된다.
tsc 컴파일
tsc는 .ts를 .js로 컴파일한다. --noEmit은 타입 검사만 수행하고 출력하지 않으며, --watch는 변경을 감시하고, --strict는 엄격 모드다.
tsconfig.json
tsconfig.json에서 컴파일을 설정한다. target, module, strict, outDir 등을 지정하며, npx tsc는 이를 자동으로 읽는다.
TS 직접 실행
tsx/ts-node을 사용하면 TS를 별도 컴파일 없이 바로 실행할 수 있다. Node 22는 --experimental-strip-types를 네이티브로 지원한다.
엄격 모드
strict: true는 모든 엄격 검사를 활성화한다. null 검사, 암묵적 any에 대한 오류, 사용하지 않는 변수에 대한 경고 등이 포함된다. 새 프로젝트에서는 반드시 켜야 한다.
TS와 JS의 관계
TS는 컴파일 시점에 타입을 검사하며, 컴파일된 JS에는 타입 정보가 없다. 타입은 컴파일 시점에만 존재하고, 런타임에는 사라진다.
의존성과 타입 패키지
라이브러리에는 타입 정의가 필요하다. @types/*는 DefinitelyTyped 커뮤니티 타입 패키지이며, typescript는 컴파일 도구 의존성이다.
에디터 통합
VS Code는 TS를 기본 지원한다. 호버로 타입을 확인하고, 오류는 빨간 밑줄로 표시되며, 자동 완성 및 리팩토링을 제공한다. 오류 메시지는 그대로 표시된다.
2.변수와 타입 표기
타입 표기, 타입 추론, 유니온 타입, any/unknown 그리고 타입 단언.
타입 표기
변수명 뒤에 : 타입 형식으로 타입을 표기한다. 표기 후 타입이 고정되며, 다른 타입을 대입하면 컴파일 오류가 발생한다.
타입 추론
TS는 초기화 값으로부터 타입을 추론하므로 대부분의 경우 명시적 표기가 필요 없다. 복잡한 타입은 명시적 인터페이스를 권장한다.
유니온 타입
| 유니온 타입은 "또는"을 나타낸다. 예를 들어 string | number는 둘 다 허용한다. 멤버에 접근하려면 먼저 타입 가드가 필요하다.
any와 unknown
any는 타입 검사를 비활성화하므로(피해야 함), unknown은 미지의 값을 나타낸다(가드 후에만 사용 가능). 외부 데이터를 안전하게 처리할 때는 unknown을 사용한다.
타입 단언
as 단언은 컴파일러보다 자신이 더 잘 안다고 선언하는 것이다. 단언은 런타임을 바꾸지 않으며, 컴파일 시점의 선언일 뿐이다. 남용하면 오류를 가린다.
non-null 단언
! 접미사는 값이 null/undefined가 아님을 단언한다. 확실할 때만 사용해야 하며, 그렇지 않으면 런타임에 충돌할 수 있다.
리터럴 타입
리터럴 타입은 타입을 구체적인 값으로 한정한다. 예를 들어 'up', 42, true 등이 있다. 유니온과 함께 사용해 옵션을 열거한다.
구조 분해와 타입
구조 분해 할당에서도 타입이 유지된다. 함수 매개변수를 구조 분해할 때는 매개변수 객체 전체의 타입을 표기해야 한다.
3.타입 시스템
기본 타입, 객체/배열/튜플, 인터페이스, 제네릭, 타입 별칭 그리고 타입 조작.
기본 타입
string, number, boolean, null, undefined, void, symbol, bigint로 구성된 기본 타입 집합이다.
배열과 튜플
number[]는 배열, [string, number]는 튜플(고정 길이·고정 순서), readonly는 읽기 전용 배열이다.
객체 타입
객체 타입은 형태를 묘사한다. 속성, 선택적 ?, 읽기 전용 readonly, 메서드 시그니처 등을 포함한다.
interface와 type
interface는 객체 형태를 정의하며(확장 가능), type 별칭은 더 유연하다(유니온/교차/튜플). 일반적으로는 interface를 우선 사용한다.
열거형
enum은 명명된 상수 집합이다. 숫자 열거형, 문자열 열거형, const enum 등이 있으며, 문자열 열거형이 더 자주 쓰인다.
제네릭
제네릭은 타입을 매개변수화한다. T는 타입 매개변수이며, 함수/클래스/인터페이스를 범용적으로 재사용할 수 있게 하고 컴파일 시점에 결정된다.
keyof와 인덱스
keyof는 객체 키의 유니온을 얻고, T[K]는 인덱스 접근이며, 매핑 타입은 타입 조작의 핵심 도구다.
내장 유틸리티 타입
Partial, Omit, Pick, Record, Exclude, ReturnType 등의 매핑 타입이 일반적인 변환을 단순화한다.
템플릿 리터럴 타입
템플릿 문자열 문법으로 문자열 타입을 구성한다. 유니온과 결합하여 순열 조합을 생성할 수 있으며, 문자열 파싱을 타입 수준에서 구현하는 기법이다.
4.타입 가드와 null 값
타입 가드, 타입 좁히기, 옵셔널 체이닝, null 처리 그리고 참조 의미.
타입 가드
typeof, instanceof, in으로 유니온 타입을 좁힌다. 분기 내부에서 타입이 자동으로 좁아진다.
타입 좁히기
가드 이후 타입은 해당 범위 내에서 좁아진다(narrowing). null 검사나 truthy 검사 모두 타입을 좁힌다.
식별 유니온
식별 유니온은 공통 판별 필드(kind/type)를 공유하며, switch 이후 타입이 정확하게 좁아진다. 상태 모델링에 적합하다.
옵셔널 체이닝과 nullish 병합
?.는 안전한 접근, ??는 nullish에 대한 기본값, ??=는 기본값 할당이다. 체인 형태의 깊은 접근으로 null로 인한 충돌을 방지한다.
null과 undefined
strictNullChecks가 켜져 있으면 null/undefined는 일반 타입에 대입할 수 없다. 명시적 유니온이나 명시적 처리가 필요하다.
참조 의미
TS는 JS의 참조 의미를 바꾸지 않는다. 객체는 참조로 공유되고 배열은 얕은 복사된다. 타입은 그 형태만 기술할 뿐이다.
사용자 정의 타입 가드
is 문법으로 함수가 타입 가드임을 선언한다. boolean을 반환하며 매개변수의 타입을 좁힌다. 배열 필터링에 자주 쓰인다.
단언 함수
asserts 단언 함수는 불변 조건을 선언한다. 반환 타입은 void이지만 호출 후 타입이 좁아지며, 오류를 던지면 실행이 중단된다.
5.제어 흐름
분기, 반복, switch와 타입 좁히기의 조합.
if / else
if/else 분기에 타입 가드를 결합한다. 조건식이 변수의 타입을 좁힌다.
switch와 완전성 검사
switch는 식별 유니온을 처리한다. default 분기에서 never를 사용해 모든 경우가 처리되었는지 검사할 수 있다.
반복문
for, for...of, while로 순회한다. 배열은 for...of로 반복하고, 인덱스가 필요하면 for 또는 entries를 사용한다.
삼항 연산자와 타입
삼항 연산자의 양쪽 분기 타입이 유니온된다. 조건에 따라 다른 타입이 반환되면 결과는 유니온 타입이 된다.
break와 continue
continue는 현재 반복을 건너뛰고, break는 종료하며, 레이블이 있는 break/continue는 중첩을 제어합니다.
조기 반환
가드 절로 일찍 return하면 중첩이 줄어듭니다. null 체크 후에는 타입이 좁혀집니다.
do...while
do...while은 본문을 먼저 한 번 실행한 뒤 조건을 검사합니다. 최소 한 번은 실행해야 하는 반복에 씁니다. 타입은 관여하지 않습니다.
객체 순회
Object.keys는 객체의 키를 순회합니다. 타입 단언에 keyof를 쓰면 안전합니다. 값을 순회할 때는 Object.values를 사용합니다.
6.함수
함수 타입 표기, 선택/기본 매개변수, 오버로드, rest 매개변수, this.
함수 타입
함수 타입 표기: 매개변수 타입과 반환 타입. 화살표 함수의 타입과 함수 선언문은 동등합니다.
선택 매개변수와 기본 매개변수
?는 선택 매개변수, =는 기본 매개변수입니다. 기본 매개변수는 암묵적으로 선택입니다. 선택 매개변수는 필수 매개변수 뒤에 와야 합니다.
rest 매개변수
...rest는 개수가 정해지지 않은 매개변수를 배열로 수집합니다. rest 매개변수는 배열 타입으로 표기해야 합니다.
오버로드 시그니처
오버로드: 여러 시그니처 선언 + 하나의 구현. 호출 시 시그니처와 매칭됩니다. 매개변수 조합에 따라 반환 타입을 제약합니다.
제네릭 함수
제네릭 매개변수 제약: T extends 제약조건. 제약으로 타입을 제한한 뒤 그 제약 타입의 멤버를 사용할 수 있습니다.
this 타입
this 매개변수로 this 타입을 표기합니다. 메서드 체인은 this를 반환해 체이닝을 구현합니다. 화살표 함수는 this를 바인딩하지 않습니다.
콜백과 함수 매개변수
콜백 함수를 매개변수로 사용: 함수 타입으로 표기합니다. 배열 고차 함수 map/filter/reduce의 타입 추론.
함수 제약 팁
매개변수 유니언 좁히기, 선택적 콜백, 반환 추론. 함수 매개변수에는 구체적인 클래스보다 인터페이스를 쓰는 편이 낫습니다.
7.문자열
템플릿 문자열, 자주 쓰는 메서드, 정규식과 문자 처리.
템플릿 문자열
백틱 템플릿 문자열: ${}로 보간하고 여러 줄을 그대로 유지합니다. 타입은 여전히 string입니다.
자주 쓰는 메서드
slice/substring으로 부분 문자열을 잘라내고, toUpperCase로 변환하며, split으로 나누고, includes/startsWith로 조회하며, replace로 교체합니다.
템플릿 리터럴 타입
타입 수준 템플릿 문자열: ${}로 타입을 이어 붙입니다. infer로 문자열 구조를 추출해 추론합니다.
문자와 코드 포인트
length는 UTF-16 코드 유닛 수입니다(이모지는 둘로 계산됨). 코드 포인트를 순회할 때는 for...of 또는 Array.from을 사용합니다.
정규식
RegExp로 매칭과 교체를 합니다. match는 캡처 그룹 배열을 반환하고, matchAll은 전역 순회합니다. 타입 수준에서 RegExp는 고정되어 있습니다.
로케일과 비교
localeCompare로 로케일 비교, toLocaleLowerCase로 로케일 변환, Intl로 숫자/날짜 포맷을 지정합니다.
이스케이프 문자
문자열 이스케이프: \n 줄바꿈, \t 탭, \\ 백슬래시, \u 코드 포인트. 작은따옴표와 큰따옴표 모두에서 이스케이프합니다.
뒤집기와 비교
문자열을 뒤집을 때는 split과 배열을 사용하고, 공백을 제거하며, 중복을 없앱니다. 비교에는 localeCompare 또는 정규화된 비교를 사용합니다.
8.컬렉션과 객체
배열, 객체, Map/Set과 불변 업데이트 패턴.
배열 연산
push/pop은 끝쪽, unshift/shift는 앞쪽, splice는 추가/삭제, slice는 복사, includes/indexOf는 조회.
map / filter / reduce
함수형 순회: map으로 변환, filter로 거르고, reduce로 집계, find로 찾고, every/some로 판정. 새 배열을 반환하며 원본 배열은 바꾸지 않습니다.
객체 연산
스프레드로 합치기 {...a, ...b}, Object.keys/values/entries로 순회, keyof로 타입의 키.
Map
Map은 임의 키 매핑: set/get/has/delete/size. 삽입 순서를 유지하고 O(1) 조회.
Set
Set은 중복 없는 집합: add/delete/has/size. 배열의 중복을 제거하거나 차집합/합집합을 구할 때 사용합니다.
불변 업데이트
제자리 변경 대신 스프레드/복사로 업데이트합니다. 객체 교체, 배열 추가/삭제는 새 참조를 반환합니다. React 상태에서 흔히 쓰입니다.
튜플과 Record
튜플은 고정 길이, Record는 키-값 매핑입니다. 객체 리터럴에 as const를 붙여 상수로 변환합니다.
WeakMap / WeakSet
WeakMap/WeakSet의 키는 반드시 객체여야 하며 약한 참조입니다. GC를 막지 않습니다. 메타데이터 캐싱이나 부작용용으로 사용합니다.
9.성능과 메모리
가비지 컬렉션 아래의 메모리 관점, 대용량 데이터, 문자열 최적화와 모니터링.
가비지 컬렉션
TS/JS는 GC가 있어 수동 해제가 필요 없습니다. 더 이상 참조되지 않는 객체는 회수됩니다. 긴 수명을 가진 객체는 클로저가 붙잡고 있지 않도록 주의하세요.
대용량 배열
대용량 배열 연산에는 TypedArray나 스트리밍을 고려하세요. filter/map은 새 배열을 만들어 비용이 발생합니다. 반복문에서 재사용하는 편이 더 경제적입니다.
문자열 메모리
문자열은 불변이며 이어 붙이면 새 문자열이 만들어집니다. 대량의 연결은 배열 join이나 템플릿을 사용하세요. 문자열 인터닝(interning).
WeakRef와 캐시
WeakRef는 약한 참조라 가비지 컬렉션을 막지 않고, WeakMap/WeakSet은 키가 약하게 참조됩니다. 캐시나 부작용 추적에 약한 컨테이너를 사용하세요.
성능 팁
any 사용은 최적화를 늦추므로 피하고, 재할당을 줄이며, 결과를 캐시합니다. V8 최적화는 안정적인 형태의 객체에 의존합니다.
메모리 모니터링
Node에서 메모리를 확인할 때는 process.memoryUsage(), --max-old-space-size를 사용합니다. 브라우저에서는 Performance API를 사용합니다.
클로저와 메모리
클로저는 외부 변수를 붙잡아 그 수명을 연장합니다. 반복문 안의 클로저 함정에 주의하세요. 참조를 해제합니다.
TypedArray와 바이너리
TypedArray는 바이너리 수치를 다룹니다: Uint8Array/Float64Array. 뷰는 내부 buffer를 공유합니다.
10.클래스와 객체 지향
class, 접근 제어자, 상속, 추상 클래스, 제네릭 클래스.
class 기본
class 문법: 필드, 생성자, 메서드. 필드는 타입과 가시성을 표기할 수 있습니다.
접근 제어자
public은 공개, private은 비공개, protected는 보호, readonly는 읽기 전용입니다. 모두 컴파일 시점에 검사됩니다.
상속과 override
extends로 상속, super()로 부모 생성자 호출, override로 부모 메서드 재정의. 자식은 부모의 일종입니다(is-a).
추상 클래스와 인터페이스
abstract 클래스는 인스턴스화할 수 없으며, 추상 메서드는 자식이 반드시 구현해야 합니다. 인터페이스는 모양을 제약합니다. 추상 클래스는 구현을 가질 수 있습니다.
implements
class implements 인터페이스: 클래스는 인터페이스의 모양을 충족해야 합니다. 한 클래스가 여러 인터페이스를 구현할 수 있습니다.
제네릭 클래스
제네릭 클래스: 타입 매개변수는 필드와 메서드에 사용된다. 제약을 통해 제네릭의 범위를 한정한다.
getter / setter
get/set 접근자가 필드의 읽기/쓰기를 감싼다. 검증과 계산 로직을 추가할 수 있다.
정적 멤버
static은 클래스 수준의 필드와 메서드를 정의한다. 정적 멤버는 인스턴스에 의존하지 않는다. 팩토리 메서드와 상수에 static을 사용한다.
11.예외 처리
throw/try-catch, 오류 타입, 사용자 정의 오류, 비동기 오류.
throw / try-catch
throw로 오류를 던지고, try-catch로 잡고, finally로 마무리한다. catch 변수는 기본적으로 unknown이므로 좁혀야 한다.
사용자 정의 오류
extends Error로 사용자 정의 오류 클래스를 만든다. 추가 정보를 함께 담는다. 오류 이름은 타입을 구분하는 데 쓰인다.
일반적인 오류 타입
Error 베이스 클래스: TypeError 타입 오류, RangeError 범위 초과, ReferenceError 참조 오류. 판별은 instanceof를 쓴다.
비동기 오류
async 함수의 throw는 rejected Promise가 된다. await 시 try-catch로 잡는다. Promise.catch 체이닝.
오류 경계
모듈 경계에서 오류를 잡아 변환한다. 서드파티 오류는 통일해 감싼다. 오류가 빠져나가면 크래시가 발생한다.
오류 처리 패턴
예측 가능한 오류는 결과로 반환하고, 예상치 못한 오류는 예외를 던진다. Result 스타일(ok/err)과 throw는 각각의 쓰임이 있다.
오류 메시지 품질
오류 메시지에는 맥락이 포함된다: 무엇이, 어디서, 어떻게 고치는지. 사용자 정의 오류는 필드를 함께 담는다.
처리되지 않은 거부
잡히지 않은 rejected Promise는 unhandledrejection을 발생시킨다. 최상위에서 안전망을 둬 조용한 실패를 방지한다.
12.입출력
console 출력, Node 파일/스트림, fetch 네트워크, 타입이 지정된 JSON.
console 출력
console.log/info/warn/error, 템플릿 출력, %o 포맷, 그룹과 카운트.
fetch 네트워크
fetch는 비동기 요청이다. 응답을 await하고, json을 파싱하며, 오류를 처리하고, 결과를 타입 단언한다.
Node 파일
fs/promises로 비동기 읽기/쓰기. readFile/writeFile/mkdir/readdir은 Promise를 반환한다.
JSON과 타입
JSON.parse/stringify 직렬화. parse 결과는 가드로 검증이 필요하고, stringify는 함수를 무시한다.
스트리밍 처리
ReadableStream/Web Streams로 대용량 응답을 처리한다. 진행 상황을 읽고, 청크 단위로 처리한다.
환경 변수와 인자
Node에서 process.argv / process.env를 읽는다. 인자 파싱, 환경 변수 타입 좁히기.
브라우저 Web API
localStorage/sessionStorage, navigator, WebSocket의 타입. 저장 값은 직렬화가 필요하다.
파일 읽기
input[type=file]로 File을 얻고, FileReader로 텍스트/DataURL을 읽으며, 객체 URL로 미리 본다.
13.흔한 실수
일상 개발에서 가장 자주 겪는 함정과 올바른 작성법.
any 남용
any는 타입 검사를 꺼 실제 오류를 가린다. unknown + 가드가 가능하면 그쪽을 쓴다.
빈 값 판별
!!로 truthy 판별, == null로 null/undefined 동시 판별, 배열의 빈 판별. 0이나 ''를 빈 값으로 취급하지 않는다.
async 오용
async 함수는 반드시 Promise를 반환한다. await를 잊으면 Promise가 누출된다. forEach는 async 대기를 지원하지 않는다.
동등 비교
===는 엄격한 동등이다. NaN !== NaN. 객체는 참조로 비교한다. 깊은 비교는 직접 작성하거나 라이브러리를 쓴다.
null과 undefined 혼동
null은 의도적인 빈 값이고, undefined는 미할당이다. strictNullChecks에서 따로 처리한다. 옵셔널 체이닝 대 단언.
this 손실
콜백에서 this는 undefined가 된다. 화살표 함수로 바인딩하거나 명시적으로 바인딩한다. 클래스 필드에서 화살표 함수가 자주 쓰인다.
좁히기 실패
속성에 접근한 후에는 좁히기가 사라진다. 분해할당 후에야 좁혀진다. 함수 매개변수를 재할당하면 타입이 넓어진다.
완전 검사
구별 가능한 유니온의 default에서 never로 검사한다. 새 타입 분기를 누락하면 컴파일 오류가 난다.
복사와 변경
배열/객체 참조 공유로 잘못 변경될 수 있다. 업데이트할 때는 복사한다. sort는 배열을 제자리에서 바꾼다.
14.동시성과 비동기
Promise, async/await, Worker 스레드와 이벤트 루프.
Promise
Promise는 비동기 결과를 나타낸다. then 체이닝, catch 오류, finally 마무리. 타입은 Promise<T>로 표기한다.
async / await
async 함수는 Promise를 반환한다. await가 풀어준다. 오류는 try-catch로 다룬다. 최상위 await에는 ESM이 필요하다.
병렬과 경합
Promise.all은 전부 완료, allSettled은 전부(실패 포함), race는 가장 먼저 완료, any는 첫 성공.
Worker 스레드
Web Worker / Node worker_threads로 병렬 계산. postMessage 통신, transferable로 소유권을 이전한다.
이벤트 루프
동기 코드가 먼저 실행되고, 마이크로태스크(Promise)가 매크로태스크(setTimeout)보다 먼저다. 블로킹은 모든 것을 멈추게 한다.
제너레이터
function* 제너레이터는 지연 생성한다. yield로 일시정지/재개. Generator 타입 표기.
비동기 이터레이터
for await로 비동기 데이터 소스를 순회한다. 비동기 제너레이터는 async function*. 스트림 데이터를 소비한다.
동시성 제한
동시에 실행되는 비동기 작업 수를 제어한다. 배치, 세마포어 또는 p-limit 방식. 자원 과부하를 피한다.
15.네트워크와 모듈
모듈 시스템, import/export, fetch와 타입이 지정된 API 캡슐화.
ES 모듈
import/export 정적 가져오기/내보내기. TS 타입 내보내기는 export type을 쓴다. 모듈은 스코프를 격리한다.
타입 가져오기
import type은 타입만 가져오며 컴파일 시 지워진다. 런타임 의존과 순환 참조를 피한다.
타입이 지정된 API 캡슐화
fetch를 캡슐화해 강한 타입을 반환한다. 응답 검증, 오류를 통일해 처리. 제네릭 요청 함수.
Node HTTP 서비스
node:http 또는 프레임워크(Express/Fastify). 타입화된 요청 응답. 라우팅 처리.
DOM 타입
document.getElementById 반환 타입, 이벤트 타입, HTML 요소 타입 매핑.
URL과 매개변수
URLSearchParams로 쿼리 문자열 구성, URL 파싱. 타입 안전 매개변수 읽기.
WebSocket
WebSocket 양방향 통신. onmessage 이벤트, 제네릭 데이터, readyState 상태.
요청 헤더와 인증
Headers 타입 안전 설정. Authorization Bearer, Content-Type. 인터셉터로 일괄 주입.
16.시간과 날짜
Date 객체, 타임스탬프, 서식 지정과 시간대.
Date 기초
Date 생성, getFullYear/getMonth/getDate 읽기, set 계열 설정. 월은 0부터 시작.
타임스탬프
getTime() 밀리초 타임스탬프, Date.now(), Date.parse. 날짜 비교는 타임스탬프 사용.
서식 지정
toISOString UTC 형식, toLocaleDateString 로컬 형식, Intl.DateTimeFormat 사용자 정의.
시간대
타임스탬프는 UTC 밀리초이며, 서식 지정 시에만 로컬 시간대가 적용됨. Intl은 timeZone 옵션으로 시간대를 지정함.
타이머
setTimeout 지연, setInterval 주기, clearTimeout 취소. 반환 타입은 number.
기간과 구간
두 타임스탬프의 차는 밀리초 기간. 구간 판단은 타임스탬프 비교 사용. setInterval 드리프트 남용 방지.
날짜 라이브러리
dayjs/date-fns는 명확한 API와 시간대 처리를 제공함. 용량이 작고 불변임. 복잡한 시간대는 라이브러리 사용 권장.
고정밀 타이밍
performance.now()는 시스템 시간 조정의 영향을 받지 않는 밀리초 단위 고정밀 시간. 성능 측정용.
17.프로세스와 시스템
Node 프로세스, 명령행 도구, 표준 스트림과 빌드 산출물 실행.
Node 프로세스
process 전역 객체: argv 매개변수, env 환경, exit 종료 코드, stdout/stderr 스트림.
명령행 도구
CLI 작성: 매개변수 파싱, 도움말 출력, 종료 코드. shebang으로 스크립트 실행 가능하게 함.
표준 스트림
stdin으로 입력 읽기, stdout으로 출력, stderr로 오류. readline 상호작용. 파이프 데이터.
컴파일 산출물 실행
tsc 컴파일 후 node dist/main.js로 실행. package.json bin으로 명령 등록. 타입 선언 d.ts.
시스템 명령 실행
execFile로 외부 명령 실행, spawn은 스트리밍. child_process 타입. 인젝션 방지를 위한 이스케이프 주의.
종료 코드
0은 성공, 0이 아니면 실패. 관례: 1은 일반 오류, 2는 사용법 오류. 스크립트는 CI에서 종료 코드에 의존함.
npm scripts
package.json scripts로 명령 오케스트레이션. pre/post 훅, && 직렬, & 병렬. 빌드 체인에서 자주 사용.
설정과 환경
dotenv로 .env 로드, 타입화된 설정 객체, 런타임 검증. 설정과 코드 분리.
18.정규식과 텍스트 처리
정규식 문법, 플래그, 타입화된 매칭과 텍스트 처리 관용구.
정규식 문법
리터럴 /.../ 또는 RegExp 생성. 문자 클래스, 수량자, 그룹, 앵커.
플래그
g 전역, i 대소문자 무시, m 다중 행, s 점이 줄바꿈 매칭, u 유니코드, y 고정.
매칭과 추출
match는 배열 반환(0 전체 매칭 + 캡처 그룹), matchAll은 전역 순회, match 실패 시 null이므로 null 확인 필요.
치환
replace는 문자열/함수 치환. $1 캡처 참조, g 플래그로 전체 치환. 함수형 치환으로 로직 처리.
검증 관용구
전체 매칭은 ^...$ 앵커 사용. 숫자/이메일/URL의 일반적인 패턴. test는 boolean 반환.
정규식 성능
재앙적 백트래킹 방지: 중첩 수량자. 정규식 사전 컴파일. g 플래그의 lastIndex 상태 주의.
정규식 일반적인 함정
리터럴 이스케이프, g 플래그의 lastIndex 상태, 탐욕적 매칭, 문자열에서 \의 이중 이스케이프.
일반적인 패턴
신분증/휴대폰 번호/색상/날짜 등의 일반적인 정규식 조각. 비즈니스 형식 검증에 매칭.
19.빌드와 엔지니어링
tsconfig, 번들링 도구, Lint/포맷, 테스트와 CI.
tsconfig 상세
일반적인 컴파일 옵션: moduleResolution, declaration, noUnusedLocals, esModuleInterop, paths 경로 별칭.
번들링 도구
Vite/Webpack/Rollup 번들링. Vite는 TS/프론트엔드 기본. 라이브러리는 tsup/Rollup으로 ESM+CJS 출력.
Lint와 포맷
ESLint 규칙 검사, Prettier 포맷. ts-eslint은 타입 인식 규칙 제공.
테스트
Vitest/Jest 단위 테스트. describe/it/expect. 타입과 실행 분리. ts 직접 테스트.
CI와 배포
CI 단계: 타입 검사, Lint, 테스트, 빌드. tsc --noEmit으로 타입 오류 차단.
디버깅
sourceMap + Node inspect 중단점 디버깅. console 디버깅, 타입 단언 보조.
npm 배포
라이브러리 배포: files로 배포 내용 지정, version 시맨틱, main/types/exports 진입점. 배포 전 빌드.
monorepo 설정
npm/pnpm workspaces 다중 패키지 저장소. 공유 의존성, 패키지 간 참조, 통합 스크립트.
이 치트시트에 대해
이 페이지는 TypeScript 5.x의 자체 완비된 참조 매뉴얼로, 실제 프로젝트에서 타입 시스템과 언어 핵심의 약 80%의 일반적인 사용법을 다룸. 내용은 현대적 관용구를 중심으로 함: 인터페이스와 타입 별칭, 제네릭, 유니온/교차 타입, 타입 좁히기, 리터럴 타입, keyof/typeof, 매핑 타입과 조건부 타입, 그리고 비동기 프로그래밍과의 결합. TypeScript는 Microsoft에서 2012년에 출시되었으며, JavaScript의 상위 집합으로, 컴파일 타임에 JavaScript에 정적 타입 검사를 추가하여 대규모 프로젝트의 유지보수성을 크게 향상시키며, 현재 프론트엔드 엔지니어링의 주류 선택임. 19개 챕터는 각각 하나의 주제에 집중함: 기본 문법, 변수와 타입 추론, 타입 시스템, 참조와 값 의미, 제어 흐름, 함수와 오버로드, 문자열과 템플릿, 컬렉션, 메모리와 타입 소거, 클래스와 인터페이스, 오류 처리, 입출력, 일반적인 오해, 동시성(비동기 타입), 네트워크, 시간, 프로세스, 정규식과 빌드 도구(tsc/tsconfig). 각 섹션은 '개념 소개 + 바로 복사 가능한 코드 스니펫'으로 구성됨. 모든 코드와 텍스트는 브라우저에서 로컬로 렌더링되며, 어떤 데이터도 기기를 떠나지 않음. 권위 있는 참고 자료는 TypeScript 공식 매뉴얼을 참조.
버전 2.1.0