[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