개발/Typescript
TypeScript 타입 조합/확장 문법 정리
hanks
2025. 6. 22. 00:54
1. & (Intersection, 교차 타입)
- 여러 타입을 합쳐서 모든 속성을 가지는 새 타입을 만든다.
- 중복되는 속성이 있다면, 마지막에 선언된 타입 기준으로 덮어쓴다.
type A = { id: number; name: string }
type B = { name: string; age: number }
type AB = A & B
// AB는 { id: number; name: string; age: number }가 된다.
2. | (Union, 유니언 타입)
- 여러 타입 중 하나를 가질 수 있다.
- if/else나 switch 문, 타입 가드로 분기 처리 가능
type Status = "loading" | "success" | "error"
function printStatus(s: Status) {
// s는 세 값 중 하나만 가능
}
3. extends (타입 확장, 제네릭 제약)
- 인터페이스/타입 선언에서 부모 타입을 상속(확장)할 때 사용
- 제네릭에서 타입 제약(Constraint)으로도 자주 사용
interface Base { id: number }
interface User extends Base { name: string }
// User는 id와 name 모두 포함
function printId<T extends Base>(item: T) {
console.log(item.id)
}
4. as (타입 단언, Type Assertion)
- 변수의 타입을 개발자가 명시적으로 바꿀 때 사용
const value: any = "123"
const num = value as string
5. infer (타입 추론, 조건부 타입에서 사용)
- 타입 레벨에서 일부분을 변수로 추출해서 사용할 때 쓴다
type GetArrayElement<T> = T extends (infer U)[] ? U : never
type ElementType = GetArrayElement<string[]> // string
type ElementType2 = GetArrayElement<number[]> // number
6. 인터페이스/타입 병합
(1) 확장(상속)
interface Animal { name: string }
interface Dog extends Animal { bark(): void }
// Dog는 name과 bark() 모두 포함
(2) 타입 교차(Intersection)
type WithTimestamp = { createdAt: Date }
type UserWithTimestamp = User & WithTimestamp
7. 타입 매핑 및 변형
- Pick: 특정 속성만 추출
- Omit: 특정 속성 제외
- Partial: 모든 속성 선택적
- Required: 모든 속성 필수
- Readonly: 모든 속성 읽기 전용
type A = Pick<User, "id" | "name">
type B = Omit<User, "password">
type C = Partial<User>
type D = Required<User>
type E = Readonly<User>
8. 기타 자주 쓰이는 유틸리티/패턴
- keyof
타입의 모든 키를 유니언 타입으로 반환
type UserKeys = keyof User // "id" | "name" | "email" ...
- Record
키/값 구조의 타입을 생성
type Dict = Record<string, number>
// { [key: string]: number }
- typeof
변수/함수의 타입 추출
const obj = { a: 1, b: "2" }
type ObjType = typeof obj // { a: number; b: string }
정리 표
문법역할/용도예시
& | 교차(합치기) | A & B |
| | 유니언(둘 중 하나) | `"a" |
extends | 확장/상속/제네릭 제약 | interface A extends B / T extends X |
as | 타입 단언 | value as string |
infer | 타입 추론 | T extends (infer U)[] ? U : never |
keyof | 타입의 모든 키 유니언으로 | keyof User |
typeof | 변수/함수의 타입 가져오기 | typeof obj |
Pick/Omit | 타입 속성 추출/제외 | Pick<T, K>, Omit<T, K> |
Partial | 모든 속성을 Optional로 | Partial<T> |
Required | 모든 속성을 Required로 | Required<T> |
Readonly | 모든 속성을 읽기 전용 | Readonly<T> |
Record | 키-값 형태 타입 생성 | Record<string, number> |