React의 조건부 형식과 매핑된 형식
조건부 형식을 사용해 다른 속성 값에 따라 형태가 바뀌는 컴포넌트 속성 형식을 만듭니다.
React의 조건부 형식과 매핑된 형식은(는) CoddyKit의 무료 React Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 React Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. React Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
조건부 타입 기초
조건부 타입은 T extends U ? X : Y 구문을 사용합니다. T를 U에 할당할 수 있으면 타입은 X로 결정되고, 그렇지 않으면 Y로 결정됩니다.
type IsString<T> = T extends string ? true : false;
type A = IsString<string>; // true
type B = IsString<number>; // false
type C = IsString<'hello'>; // true다른 프롭에 따른 조건부 프롭
한 프롭의 값에 따라 다른 프롭을 필수 또는 선택 사항으로 만들려면 조건부 타입을 사용하십시오.
type InputProps<T extends 'text' | 'number'> = {
type: T;
} & (T extends 'number' ? { min?: number; max?: number } : { maxLength?: number });
const numInput: InputProps<'number'> = { type: 'number', min: 0, max: 100 };
const txtInput: InputProps<'text'> = { type: 'text', maxLength: 50 };매핑 타입
매핑 타입은 기존 타입의 각 속성을 변환하여 새로운 타입을 만듭니다. in keyof 구문은 모든 키를 순회합니다.
type Optional<T> = { [K in keyof T]?: T[K] };
type Readonly<T> = { readonly [K in keyof T]: T[K] };
type Nullable<T> = { [K in keyof T]: T[K] | null };업데이트 폼에서 프롭을 선택 사항으로 만들기
모든 필드가 필수는 아닌 업데이트 폼 프롭에는 Partial<T>(내장 매핑 타입)를 사용하십시오.
interface User { id: string; name: string; email: string; role: string; }
// Update form — all fields optional:
type UserUpdateProps = Partial<Omit<User, 'id'>>;
function UserUpdateForm(props: UserUpdateProps) {
// name, email, role are all optional
}매핑 타입과 Record
키는 유니온에서 가져오고 값은 일관된 형태를 갖는 조회 타입을 만드십시오.
type Status = 'idle' | 'loading' | 'success' | 'error';
type StatusConfig = Record<Status, {
label: string;
icon: React.ReactNode;
color: string;
}>;
const statusConfig: StatusConfig = {
idle: { label: 'Ready', icon: <ReadyIcon />, color: 'gray' },
loading: { label: 'Loading...', icon: <Spinner />, color: 'blue' },
success: { label: 'Done', icon: <CheckIcon />, color: 'green' },
error: { label: 'Error', icon: <XIcon />, color: 'red' },
};필수 키 선택하기
-?(선택 사항 제거)와 조건부 타입을 사용하여 타입에서 필수 키만 추출하십시오.
type RequiredKeys<T> = {
[K in keyof T]-?: undefined extends T[K] ? never : K;
}[keyof T];
interface FormData { name: string; email: string; phone?: string; }
type Required = RequiredKeys<FormData>; // 'name' | 'email'템플릿 리터럴 타입
템플릿 리터럴 타입은 문자열 리터럴 타입을 조합하여 타입이 지정된 이벤트 이름, CSS 클래스 문자열, API 경로를 사용할 수 있게 합니다.
type EventName = 'click' | 'change' | 'focus';
type HandlerName = `on${Capitalize<EventName>}`;
// 'onClick' | 'onChange' | 'onFocus'
type ApiPath<R extends string> = `/api/${R}`;
type UserPath = ApiPath<'users'>; // '/api/users'조건부로 프롭 추출하기
Extract와 Exclude를 사용하여 유니온 타입을 필터링하십시오.
type AllProps = 'onClick' | 'onHover' | 'onChange' | 'style';
type EventHandlers = Extract<AllProps, `on${string}`>;
// 'onClick' | 'onHover' | 'onChange'
type NonEventProps = Exclude<AllProps, `on${string}`>;
// 'style'폼 검증을 위한 매핑 타입
폼 데이터 형태를 그대로 반영하는 검증 오류 타입을 생성하십시오. 각 필드마다 하나의 오류 메시지 문자열이 생깁니다.
interface LoginForm { email: string; password: string; }
type FormErrors<T> = { [K in keyof T]?: string };
type LoginErrors = FormErrors<LoginForm>;
// { email?: string; password?: string }
const errors: LoginErrors = { email: 'Invalid email format' };판별 매핑 타입
매핑 타입과 조건부 타입을 결합하여 판별자에 따라 형태가 달라지는 타입을 만드십시오.
type EventMap = {
click: { x: number; y: number };
keydown: { key: string; code: string };
resize: { width: number; height: number };
};
type Handler<E extends keyof EventMap> = (event: EventMap[E]) => void;
function on<E extends keyof EventMap>(event: E, handler: Handler<E>) {
window.addEventListener(event, handler as EventListener);
}타입을 과도하게 설계하지 말아야 할 때
조건부 타입과 매핑 타입은 강력하지만 복잡성도 더합니다. 실제 중복을 제거하거나 실제 버그를 방지할 때 사용하고, TypeScript 지식을 보여 주기 위한 목적으로만 사용하지는 마십시오.
빠른 확인
매핑 타입 { [K in keyof T]?: T[K] }은 어떤 작업을 수행합니까?
복습
조건부 타입(T extends U ? X : Y)은 할당 가능 여부에 따라 분기되는 타입을 만듭니다. 매핑 타입([K in keyof T])은 타입의 각 속성을 변환합니다. 업데이트 폼의 부분 타입, 타입이 지정된 이벤트 맵, 폼 오류 형태, 템플릿 리터럴 API 경로에 이를 사용하십시오.
자주 묻는 질문
“React의 조건부 형식과 매핑된 형식” 강의는 무료인가요?
네 — “React의 조건부 형식과 매핑된 형식” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 React Academy 강의 전체를 잠금 해제할 수 있습니다. React Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“React의 조건부 형식과 매핑된 형식”에서 뭘 배우나요?
조건부 형식을 사용해 다른 속성 값에 따라 형태가 바뀌는 컴포넌트 속성 형식을 만듭니다. 브라우저에서 직접 실행하는 실습 코드로 React Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
React Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 React Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“React의 조건부 형식과 매핑된 형식” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 React Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 React Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 컴포넌트 변형을 위한 판별된 유니언
- React의 조건부 형식과 매핑된 형식
- 'as' 속성을 사용하는 다형성 컴포넌트
- 형식이 안전한 양식과 API 응답 계약