0Pricing
React Academy · 강의

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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 컴포넌트 변형을 위한 판별된 유니언
  2. React의 조건부 형식과 매핑된 형식
  3. 'as' 속성을 사용하는 다형성 컴포넌트
  4. 형식이 안전한 양식과 API 응답 계약
← React Academy(으)로 돌아가기