컴포넌트 제네릭 — 입문
타입 매개변수, 제약 조건 및 추론으로 재사용 가능한 컴포넌트를 만들고, 타입이 지정된 렌더링 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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- Props와 children, 이벤트 처리기와 refs
- 상태와 리듀서, Context 타이핑
- 컴포넌트 제네릭 — 입문