advanced-typestypescript
TypeScript 고급 타입 - 유틸리티 타입과 조건부 타입
✨ AI 요약
긴 글, 핵심만 먼저 — 이 글을 3줄로 정리해드려요.
조회 0
TypeScript의 고급 타입 기능을 활용하면 타입을 더 정확하고 재사용 가능하게 만들 수 있습니다.
이 글에서는 유틸리티 타입, 조건부 타입, 매핑된 타입 등을 정리합니다.
1. 유틸리티 타입
interface User {
id: number;
name: string;
email: string;
age: number;
}
// Partial: 모든 속성을 선택적으로
type PartialUser = Partial<User>;
// Required: 모든 속성을 필수로
type RequiredUser = Required<PartialUser>;
// Pick: 특정 속성만 선택
type UserName = Pick<User, "name" | "email">;
// Omit: 특정 속성 제외
type UserWithoutAge = Omit<User, "age">;
// Record: 키-값 타입 정의
type UserMap = Record<string, User>;
2. 조건부 타입
type IsArray<T> = T extends any[] ? true : false;
type A = IsArray<string[]>; // true
type B = IsArray<string>; // false
// 조건부 타입으로 함수 오버로드
type ReturnType<T> = T extends (...args: any[]) => infer R ? R : never;
function getReturnType<T extends (...args: any[]) => any>(
fn: T
): ReturnType<T> {
return fn() as ReturnType<T>;
}
infer키워드로 타입을 추론할 수 있습니다.
3. 매핑된 타입
type Readonly<T> = {
readonly [P in keyof T]: T[P];
};
type Optional<T> = {
[P in keyof T]?: T[P];
};
// 실제 사용
type ReadonlyUser = Readonly<User>;
type OptionalUser = Optional<User>;
keyof와in을 사용하여 타입을 변환할 수 있습니다.
4. 템플릿 리터럴 타입
type EventName = `on${Capitalize<string>}`;
// "onClick" | "onChange" | "onSubmit" ...
type ApiEndpoint = `/api/${string}`;
// "/api/users" | "/api/products" ...
// 실제 활용
function createHandler(event: EventName) {
// ...
}
5. 브랜드 타입
type UserId = number & { __brand: "UserId" };
type ProductId = number & { __brand: "ProductId" };
function getUser(id: UserId) {
// ...
}
const userId = 123 as UserId;
const productId = 456 as ProductId;
getUser(userId); // ✅ OK
getUser(productId); // ❌ 타입 에러
- 같은 타입이지만 의미가 다른 경우를 구분할 수 있습니다.
6. 실무 활용 예시
// API 응답 타입 변환
type ApiResponse<T> = {
data: T;
status: number;
message: string;
};
// 에러 타입
type ApiError = {
error: string;
code: number;
};
// 유니온 타입
type Result<T> = ApiResponse<T> | ApiError;
7. 실무 팁
- 점진적 학습: 기본 타입부터 시작하여 점진적으로 고급 기능 학습
- 타입 재사용: 공통 타입은 별도 파일로 분리
- 타입 가드:
typeof,instanceof로 런타임 타입 체크 - 문서화: 복잡한 타입은 주석으로 설명 추가
TypeScript 고급 타입은 "타입을 코드처럼 다룬다"는 철학을 따릅니다.
적절히 활용하면 타입 안정성을 크게 향상시킬 수 있습니다.