0Pricing
TypeScript Academy · 강의

컴포넌트 제네릭 — 입문

타입 매개변수, 제약 조건 및 추론으로 재사용 가능한 컴포넌트를 만들고, 타입이 지정된 렌더링 Props와 키를 안전하게 전달합니다.

컴포넌트 제네릭 — 입문은(는) CoddyKit의 무료 TypeScript Academy 강의입니다. 이것은 3개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 TypeScript Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. TypeScript Academy 강의에는 총 3개의 강의가 포함되어 있습니다.

소개

목표: <T>를 사용하여 다양한 데이터 형태에서 작동하는 하나의 Component를 만드십시오. 타입이 지정된 렌더링 속성을 전달하고, 키를 제한하며, 사용 방식에서 TypeScript가 T를 추론하도록 합니다.

  • 제네릭 속성과 렌더링 함수
  • extends를 사용한 제약 조건
  • 임의 타입 없이 키 추출하기

제네릭 목록

제네릭 List<T>는 항목과 렌더링의 타입을 일치시킵니다. 사용하는 쪽에서는 어떤 T든 전달할 수 있으며, T가 명확하면 추론이 작동합니다.

import React from "react"

type ListProps<T> = { items: T[]; render: (item: T, index: number) => React.ReactNode }

export function List<T>({ items, render }: ListProps<T>) {
  return <div style={{ display: "grid", gap: 6 }}>{items.map(render)}</div>
}

export default function App() {
  return (
    <div style={{ display: "grid", gap: 12 }}>
      <List<number> items={[1,2,3]} render={(n) => <span>#{n}</span>} />
      <List<{ id: string; name: string }>
        items={[{ id: "u1", name: "Ada" }, { id: "u2", name: "Lin" }]}
        render={(u) => <strong>{u.name}</strong>}
      />
    </div>
  )
}

extends를 사용한 제약 조건

T extends Keyed를 사용하여 키에 필요한 id를 요구하십시오. 호출하는 쪽에서 필수 필드가 없는 항목을 전달하면 오류가 발생합니다.

import React from "react"

type Keyed = { id: string }

type KeyListProps<T extends Keyed> = { items: T[]; render: (item: T) => React.ReactNode }

export function KeyList<T extends Keyed>({ items, render }: KeyListProps<T>) {
  return (
    <ul>
      {items.map((x) => (
        <li key={x.id}>{render(x)}</li>
      ))}
    </ul>
  )
}

export default function App() {
  const users = [{ id: "u1", name: "Ada" }, { id: "u2", name: "Lin" }]
  return <KeyList items={users} render={(u) => <span>{u.name}</span>} />
}

T 추론

타입 매개변수는 일반적으로 속성에서 추론됩니다. 여기서 T는 items에서 가져옵니다. 추론이 명확하지 않을 때만 타입을 지정하십시오.

import React from "react"

type GridProps<T> = { items: T[]; columns?: number; render: (item: T) => React.ReactNode }

export function Grid<T>({ items, columns = 2, render }: GridProps<T>) {
  const css = { display: "grid", gridTemplateColumns: `repeat(${columns}, 1fr)`, gap: 8 }
  return <div style={css as React.CSSProperties}>{items.map(render)}</div>
}

export default function App() {
  const products = [
    { sku: "p1", title: "Mouse", price: 25 },
    { sku: "p2", title: "Keyboard", price: 80 }
  ]
  // T is inferred from products; no need to annotate
  return <Grid items={products} render={(p) => <span>{p.title} — ${p.price}</span>} />
}

렌더링 도우미

명확성을 위해 재사용 가능한 Render<T> 타입을 추출하십시오. 키를 지원해야 한다면 필요에 따라 제한하십시오(T extends { id: string }).

import React from "react"

type Render<T> = (item: T) => React.ReactNode

type TableProps<T extends { id: string }> = { items: T[]; renderRow: Render<T> }

export function Table<T extends { id: string }>({ items, renderRow }: TableProps<T>) {
  return (
    <table>
      <tbody>
        {items.map((x) => (
          <tr key={x.id}><td>{renderRow(x)}</td></tr>
        ))}
      </tbody>
    </table>
  )
}

export default function App() {
  const rows = [ { id: "1", label: "One" }, { id: "2", label: "Two" } ]
  return <Table items={rows} renderRow={(r) => <span>{r.label}</span>} />
}

팁과 주의할 점

팁:

  • 추론을 우선하고, 가독성에 도움이 될 때만 타입을 지정하십시오.
  • 요구 사항을 표현하려면 extends로 제한하십시오.
  • 제네릭 렌더링 속성에서 any를 사용하지 마십시오. 타입 안전성이 무력화됩니다.

제네릭 Component 확인

빠른 확인: 제네릭 React Component를 올바르게 정의하는 선언은 무엇입니까?

복습

복습: <T>를 사용해 재사용 가능한 Component를 만들고, 키에는 extends로 제한을 추가하며, 추론을 활용해 코드를 간결하게 유지하십시오.

자주 묻는 질문

“컴포넌트 제네릭 — 입문” 강의는 무료인가요?

네 — “컴포넌트 제네릭 — 입문” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 TypeScript Academy 강의 전체를 잠금 해제할 수 있습니다. TypeScript Academy 강의에는 총 3개의 강의가 포함되어 있습니다.

“컴포넌트 제네릭 — 입문”에서 뭘 배우나요?

타입 매개변수, 제약 조건 및 추론으로 재사용 가능한 컴포넌트를 만들고, 타입이 지정된 렌더링 Props와 키를 안전하게 전달합니다. 브라우저에서 직접 실행하는 실습 코드로 TypeScript Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

TypeScript Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 TypeScript Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 3개 중 3번째 강의입니다.

“컴포넌트 제네릭 — 입문” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 TypeScript Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 TypeScript Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. Props와 children, 이벤트 처리기와 refs
  2. 상태와 리듀서, Context 타이핑
  3. 컴포넌트 제네릭 — 입문
← TypeScript Academy(으)로 돌아가기