개발/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>