[TS] ํ์ ์คํฌ๋ฆฝํธ ๋ ์ข ๋ฅ์ ํค(key) ํ์ ์ ๋ฐ์ ๋ ๊ฐ์ฒด ์ ๊ทผํ๊ธฐ
๋ฌธ์  ์ํฉ
์๋์ ๊ฐ์ ํ์ ์ด ์๋ค๊ณ ๊ฐ์ ํด๋ณด์.
export type OrderStatus = 'pending' | 'new' | '...์๋ต';
export type Client = { user_id: number; company_name: string };
export type OrderFilterParams = {
  status: Array<OrderStatus>;
  client: Array<Client>;
  // ...์๋ต
};
ClientAndOrderFilter ์ปดํฌ๋ํธ์์  "status" | "client" ๋ ์ข
๋ฅ์ ํ์
์ ๋ฐ์ params[type] ํํ๋ก OrderFilterParams ๊ฐ์ฒด์ ์ ๊ทผํด์ ๊ฐ์ ๋ณ๊ฒฝํด์ผ ํ๋ ์ํฉ์ด๋ค. 
interface ClientAndOrderFilterProps {
  setParams: Dispatch<SetStateAction<OrderFilterParams>>;
  params: OrderFilterParams;
  type: 'status' | 'client';
  // ...
}
ํ์ง๋ง ClientAndOrderFilter ์ปดํฌ๋ํธ์์ ์ด๋ค ์ข
๋ฅ์ type("status" | "client")์ ๋ฐ์์ง ํ์
์คํฌ๋ฆฝํธ๋ ์ ์ ์๊ธฐ ๋๋ฌธ์ params[type] ํํ๋ก ์ ๊ทผํ๋ฉด ํ์
 ์ถ๋ก ์ด ์ด๋ค์ง์ง ์์ ์๋ฌ๊ฐ ๋ฐ์ํ๊ณ  ์๋ค. 
ํด๊ฒฐ ๋ฐฉ์
์๋์ฒ๋ผ ์๋ณ์ ์์ญ์์  type("status" | "client") Prop ํ์
์ผ๋ก T์ ์ ์ฝ ์กฐ๊ฑด์ ์ง์ ํ๊ณ , ๊ตฌํ๋ถ์์  T ํ์
์ ๋ฐ๋ผ ๋ค๋ฅธ ๊ฐ์ ๋ฐํํ๋ ์กฐ๊ฑด๋ถ ํ์
(OrderStatus[] | Client[])์ ์ฌ์ฉํ๋ฉด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ  ์ ์๋ค. 
// ๋ณ๊ฒฝ ์  (๊ฐ key์ ํ ๋น๋  ๊ฐ์ ๊ณ ์ ํ์ง ์์์ผ๋ฏ๋ก ์์  ํ์)
export type OrderFilterParams = {
  [key in OrderFilterType]?: Array<OrderStatus | ISODateString | ClinicLabType>;
};
// ๋ณ๊ฒฝ ํ
export type OrderFilterParams = {
  status: Array<OrderStatus>;
  client: Array<Client>;
  startdate: Array<ISODateString>;
  enddate: Array<ISODateString>;
};
export type ListType = 'status' | 'client';
// OrderStatus[] / Client[] 2๊ฐ์ง ์ข
๋ฅ์ ๋ฐฐ์ด์ ๋ฐ์ผ๋ฏ๋ก ์ ๋ค๋ฆญ ์ฌ์ฉํด์ ํ์
 ๊ฐ๋
// <T = ListType> ๋ถ๋ถ์ ํ์
 ์๋ณ์. "status" | "client"๋ฅผ T์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ง์ 
// Array<T extends ...> ๋ถ๋ถ์ ํ์
 ๊ตฌํ๋ถ. T๋ฅผ "status"๋ก ๋ฐ์ผ๋ฉด OrderStatus[] ํ์
์ ๋ฆฌํดํ๊ณ  ๊ทธ ์ธ์ Client[] ํ์
 ๋ฆฌํด
export type ListFilter<T = ListType> = Array<
  T extends 'status' ? OrderStatus : Client
>;
์ด์  params[type]์ ํ์
์ ListFilter<typeof type>์ผ๋ก ์ง์ ํ๋ฉด ํ์
 ์๋ฌ๊ฐ ํด๊ฒฐ๋๋ค. โจ
const clickHandler = (status: ListFilterStatus) => {
  setParams((prevParams) => {
    const params: ListFilter<typeof type> = prevParams[type];
    // ...
    return {
      ...prevParams,
      [type]: params.filter((param) => {
        /* ... */
      }),
    };
  });
};
๊ธ ์์ ์ฌํญ์ ๋ ธ์  ํ์ด์ง์ ๊ฐ์ฅ ๋น ๋ฅด๊ฒ ๋ฐ์๋ฉ๋๋ค. ๋งํฌ๋ฅผ ์ฐธ๊ณ ํด ์ฃผ์ธ์
'๐ช Programming' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [JS] ์ํ๋ ํฌ๋งท์ผ๋ก ๋ ์ง ๋ณํ โ toLocaleDateString (0) | 2024.05.09 | 
|---|---|
| [React] useInfiniteQuery + IO API ์ฌ์ฉ์ ๋ฌดํ ๋ ๋๋ง ๋ฌธ์  ํด๊ฒฐ (0) | 2024.05.09 | 
| [React] ๋ฆฌ์กํธ ref ๊ฐ์ฒด ์ฌ๋ฌ๊ฐ ๋ง๋ค๊ธฐ (0) | 2024.05.08 | 
| [Next.js] document is not defined ์ค๋ฅ ํด๊ฒฐ ๋ฐฉ๋ฒ (0) | 2024.05.08 | 
| [TS] @ts-ignore, @ts-expect-error ํ์ ์คํฌ๋ฆฝํธ ์ฃผ์ ์ฐจ์ด์  (0) | 2024.05.08 | 
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
- 
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
 - 
์นด์นด์คํก
์นด์นด์คํก
 - 
๋ผ์ธ
๋ผ์ธ
 - 
ํธ์ํฐ
ํธ์ํฐ
 - 
Facebook
Facebook
 - 
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
 - 
๋ฐด๋
๋ฐด๋
 - 
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
 - 
Pocket
Pocket
 - 
Evernote
Evernote
 
๋ค๋ฅธ ๊ธ
- 
[JS] ์ํ๋ ํฌ๋งท์ผ๋ก ๋ ์ง ๋ณํ — toLocaleDateString
[JS] ์ํ๋ ํฌ๋งท์ผ๋ก ๋ ์ง ๋ณํ — toLocaleDateString
2024.05.09 - 
[React] useInfiniteQuery + IO API ์ฌ์ฉ์ ๋ฌดํ ๋ ๋๋ง ๋ฌธ์  ํด๊ฒฐ
[React] useInfiniteQuery + IO API ์ฌ์ฉ์ ๋ฌดํ ๋ ๋๋ง ๋ฌธ์  ํด๊ฒฐ
2024.05.09 - 
[React] ๋ฆฌ์กํธ ref ๊ฐ์ฒด ์ฌ๋ฌ๊ฐ ๋ง๋ค๊ธฐ
[React] ๋ฆฌ์กํธ ref ๊ฐ์ฒด ์ฌ๋ฌ๊ฐ ๋ง๋ค๊ธฐ
2024.05.08 - 
[Next.js] document is not defined ์ค๋ฅ ํด๊ฒฐ ๋ฐฉ๋ฒ
[Next.js] document is not defined ์ค๋ฅ ํด๊ฒฐ ๋ฐฉ๋ฒ
2024.05.08