TypeScript 최소 기초 — 타입 에러 읽기 · any 회피
TypeScript 최소 기초 — 타입 에러 읽기 · any 회피
🎯 이 lesson 을 읽고 나면
이 lesson 을 다 읽고 나면 아래 3가지를 자신 있게 할 수 있습니다.
- ▸✅ any 를 unknown 으로 바꿔 안전성 회복
- ▸✅ interface vs type · 유니언 · 옵셔널 · never
- ▸✅ Utility Types 5개 (Partial · Pick · Omit · Record · Required)
학습 목표를 체크리스트로 두고 다 답할 수 있게 되면 lesson 을 닫으세요.
⚠️ tsconfig 전제 조건 — strict 모드 기준
모든 예시는 "strict": true 기준
strict 가 꺼져 있으면 — 다른 언어가 됩니다
- ▸
null이 모든 타입에 할당 가능 →string변수에 null 들어가도 에러 X - ▸
noImplicitAny꺼지면function f(x)의x가 자동 any → 타입 검사 무력화 - ▸
unknown/never의 narrowing 동작이 느슨해짐
확인 방법
규칙: 신규 프로젝트는 strict: true 기본값 (Vite·Next.js·CRA 모두). 기존 프로젝트에서 실습 전 반드시 확인하세요. 꺼져있으면 "왜 책 대로 안 되지?" 의 99% 원인이 이것.
왜 TypeScript 가 토큰을 절약하나
사실 — 2026년 신규 프로젝트의 90% 는 TypeScript
Cursor, v0.dev, Claude Code, GitHub Copilot — 모두 TypeScript 를 우선 생성 합니다. JS 로 시작해도 어느 순간 .ts 파일 이 추가됩니다.
토큰 절약 메커니즘 — 타입 정보가 컨텍스트
AI 에게 "sendEmail(currentUser, welcome) 호출 코드 짜줘" 라고 하면:
- ▸JS 라면 → user 가 뭔지·어떤 필드가 있는지 다시 알려줘야 함
- ▸TS 라면 → AI 가 interface 만 보고 자동 추론. 추가 설명 불필요
타입 정의 자체가 AI 컨텍스트. 추가 프롬프트 = 추가 토큰. TS 로 줄어듭니다.
기본 타입 8가지
any 가 왜 위험한가
any 는 TS 의 모든 안전성을 끔. AI 가 any 를 쓰면 unknown 으로 바꿔달라 요청하세요.
unknown — 안전한 any
사용 전 타입 확인 강제. API 응답 파싱·외부 입력에 표준.
interface vs type · 유니언 · 옵셔널
interface vs type — 언제 뭘 쓰나
규칙: 객체 모양은 interface, 그 외 (유니언·튜플·매핑) 는 type. 팀 컨벤션이 "무조건 type" 인 경우도 많음.
유니언 | — 여러 타입 중 하나
리터럴 유니언 이 가장 자주:
enum 대신 리터럴 유니언 이 현재 표준.
옵셔널 ?
? 가 붙으면 undefined 도 허용. 함수 파라미터·DTO 에 자주.
제네릭 <T> — 기본 형태
"타입을 변수처럼" — 호출할 때 결정. 라이브러리 (React Hook, Array 메서드) 가 광범위 사용.
never — 절대 도달 불가 타입
never 의 정체
모든 타입의 하위 타입. "존재할 수 없는 값" 을 표현. 함수가 절대 정상 반환 못 함 (throw 또는 무한 루프) 도 never:
Exhaustive Check — switch 누락을 컴파일 타임에 잡기
Shape 에 'star' 를 추가하면 — switch 가 그것을 처리 안 하므로 s 의 타입이 'star' 로 좁혀짐 → never 변수에 할당 불가 → 컴파일 에러. "새 케이스 추가했으면 여기도 처리해" 라는 컴파일러의 강제 알림.
Java 의 sealed class, Rust 의 enum 매칭 과 같은 사상의 TS 버전.
never vs void — 면접 단골
실무 활용 — discriminated union 의 안전망
이 패턴이 TS 코드에 적힌 모든 곳 — discriminated union + never default 체크. 이걸 알면 면접에서 "TS 가 JS 보다 좋은 점" 답이 단단해집니다.
Utility Types — 면접 단골 5개
TS 내장 타입 변환기
기존 타입을 가공해 새 타입 만들기. 5개만 알면 실무 99% 커버.
1. Partial<T> — 모든 필드 optional
2. Required<T> — 모든 필드 필수 (Partial 의 반대)
3. Pick<T, K> — 일부 필드만 선택
4. Omit<T, K> — 일부 필드 제외
5. Record<K, V> — 키-값 맵
enum 의 대체 — 키가 유니언 타입이면 컴파일러가 모든 키를 채웠는지 검사. 누락하면 에러.
면접 포인트 — 이 3개 패턴이 실무 매일 등장
- ▸Partial → PATCH API DTO (
Partial<User>) - ▸Omit → 민감 필드 제거 (
Omit<User, 'password' | 'tokenSecret'>) - ▸Record → 권한·언어·상태 맵 (
Record<Role, Permission[]>)
다른 Utility Types — 알면 도움
ReturnType / Awaited 도 면접 자주 등장. "이 함수의 리턴 타입을 어떻게 다른 곳에서 재사용해요?" 답이 ReturnType.
타입 에러 읽기 · 타입 단언 · React 와의 만남
에러 메시지를 천천히 읽으세요
아래쪽에 진짜 원인. "email 이 빠졌다" — 주는 쪽이 받는 쪽 타입을 만족 못함.
타입 단언 as — 너무 자주 쓰면 위험
"믿어, 이건 HTMLDivElement 야" — TS 의 검사를 수동으로 무시.
남용 금지. as 가 많은 코드 = TS 안 쓰는 것과 동일. narrowing (if (typeof x === ...)) 이나 타입 가드 가 우선.
타입 가드
x is User 가 반환 타입 — 호출 위치에서 TS 가 narrowing 적용.
React 컴포넌트 타입
props 인터페이스를 분리해 정의 가 표준.
useState 타입 추론
null 가능성이 있으면 명시 — 추론이 null 만 보고 null 타입 으로 좁혀버리는 함정.
API 응답 타입
리턴 타입을 명시 하면 호출자에서 자동 narrowing.
🤖 AI 에게 이렇게 요청해보세요
- ▸"이 함수에 TypeScript 타입을 붙여줘. any 는 쓰지 말고 unknown 또는 명시 타입으로"
- ▸"이 에러 메시지를 한글로 해석해줘" (그대로 붙여 보내면 AI 가 풀이)
- ▸"이
as단언을 타입 가드로 바꿔줘"
TS 5가지 (interface · 유니언 · 옵셔널 · narrowing · 제네릭) 만 알면 바이브 코딩의 90% 가 풀립니다.
`as` vs `as const` — 둘은 완전히 다른 도구
as — 타입 시스템 우회 (위험)
컴파일러의 검사를 수동으로 끔. 잘못 단언하면 런타임에서 폭발.
as const — 리터럴 타입 고정 (안전한 대안)
배열 → 유니언 타입 생성 패턴 — as const 의 진짜 가치
값과 타입이 항상 동기화. ROLES 에 'staff' 추가하면 Role 도 자동으로 'admin' | 'user' | 'guest' | 'staff' 가 됨. 일반 enum 의 한계를 우아하게 극복.
객체 freezing — 설정·상수 모음
실무 예시 — Discriminated Union 생성
한 줄 요약
- ▸as — 컴파일러를 속여서 타입을 강제. 거의 쓰지 마세요.
- ▸as const — 값에서 정확한 리터럴 타입을 뽑아냄. 안전. 자주 쓰세요.