Programming/TypeScript

[TypeScript] ์ œ๋„ค๋ฆญ ์ปดํฌ๋„ŒํŠธ (generic component) ์ •์˜ ๋ฐ ์‚ฌ์šฉ๋ฐฉ๋ฒ•

yuri lee 2023. 8. 22. 20:52
๋ฐ˜์‘ํ˜•
์ด ๊ธ€์€ ์›๊ธ€์„ ์ฐธ๊ณ ํ•˜์—ฌ ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค. 

 

Definition

TypeScript Generics๋Š” ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. generics๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ์žฅ๊ธฐ์ ์œผ๋กœ ํ™•์žฅ๊ฐ€๋Šฅํ•  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์œ ์—ฐํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ณด์žฅํ•ด์ค๋‹ˆ๋‹ค.

 

Example

# Props

interface Props<T> {
    renderItem: (item: T) => React.ReactNode;
    keyExtractor: (item: T) => string;
    data: T[];
}
  • data: ์ œ๋„ค๋ฆญ ํƒ€์ž… T๋ฅผ ๋ฐ›์„ ๋ฐฐ์—ด ์š”์†Œ
  • renderItem: ํƒ€์ž… T์˜ react ์š”์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜
  • keyExtractor: ํ‚ค๋ฅผ ์ถ”์ถœํ•˜๋Š” ํ•จ์ˆ˜

 

# Component ์ •์˜

const GenericList = <T extends unknown>({
  data,
  renderItem,
  keyExtractor
}): Props<T>) => {
  return (
    <div>
      {data.map((item) => (
        <div key={keyExtractor(item)} className="item">
          {renderItem(item)}
        </div>
      ))}
    </div>
  );
};

export default GenericList;

GenericList ์ปดํฌ๋„ŒํŠธ๋Š” ์ „๋‹ฌ๋˜๋Š” ๋ฐ์ดํ„ฐ๋กœ๋ถ€ํ„ฐ type์„ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค. renderItem์€ ์ „๋‹ฌ๋œ ๋ฐ์ดํ„ฐ type์— ์˜์กดํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ž๋™์ ์œผ๋กœ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. 

 

Conclusion

Generic components๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์œ ์ง€๋ณด์ˆ˜, refactorableํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š”๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. 

 


https://medium.com/edonec/creating-a-generic-component-with-react-typescript-2c17f8c4386e

๋ฐ˜์‘ํ˜•