๐ก๏ธ 04. Zustand์ TypeScript: "ํ์ ์ถ๋ก ์ด ์ ์๊พธ ๊นจ์ง์ฃ ?"
๐ ๊ฐ์
Zustand ์ฌ์ฉ ์ ๋ฐ์ํ๋ ํ์ ์ถ๋ก ์๋ฌ ํด๊ฒฐ ๋ฐ StateCreator๋ฅผ ์ด์ฉํ ์ฌ๋ผ์ด์ค ํ์ดํ ์๋ฒฝ ๊ฐ์ด๋
๐ฏ ์ด ์น์ ์ ์ฝ๊ณ ๋๋ฉด:
- Zustand
createํจ์์ ์ปค๋ง(Currying) ๋ฌธ๋ฒ ์๋ฆฌ๋ฅผ ์ดํดํ๊ณ ์ ํํ ์์น์ ํ์ ์ ์ฃผ์ ํ ์ ์๋ค.- ๋ฏธ๋ค์จ์ด(DevTools, Persist ๋ฑ) ์ ์ฉ ์ ํ์ ์คํฌ๋ฆฝํธ๊ฐ ์ ๊ณ ์ฅ ๋๋์ง ์๋ฆฌ๋ฅผ ํ์ ํ๊ณ ํฝ์คํ ์ ์๋ค.
StateCreatorํ์ ์ ํ์ฉํด ์ชผ๊ฐ์ง ์ฌ๋ผ์ด์ค(Slice) ์คํ ์ด์ ์๋ฒฝํ ํ์ ์ฒด๊ณ๋ฅผ ๊ตฌ์ถํ ์ ์๋ค.
๐ ๋ชฉ์ฐจ
- ๐ค ์ ์์์ผ ํ๋๊ฐ
- ๐๏ธ 1. ์์ฒ ์ด์ ๋ง๋ฒ์ (์ค๋ต) ์ฝ๋
- ๐ 2. ํต๊ณก์ ๋ฒฝ: ๋ฏธ๋ค์จ์ด ํํฐ์ ํ์ ์ง์ฅ
- ๐งฉ 3. 5๋
์ฐจ์ ๋น๊ธฐ:
StateCreator๋ก ์ฌ๋ผ์ด์ค ์กฐ๋ฆฝํ๊ธฐ - ๐๏ธโโ๏ธ ์์ฒ ์ ํ ์คํธ ํ์ (Q&A)
๐ ์ด ๋ฌธ์๋ฅผ ์ฝ๊ธฐ ์ ์
โฑ๏ธ ์์ ์ฝ๊ธฐ ์๊ฐ: 12๋ถ / ํต์ฌ ํํธ: 7๋ถ
๐บ๏ธ ์ด ๋ฌธ์์ ํ๋ฆ
create ํจ์ ๊ธฐ๋ณธ ํ์
์ฃผ์
(Currying) โ ๋ฏธ๋ค์จ์ด ์ ์ฉ ์ ํ์
์ด์ ํด๊ฒฐ โ StateCreator๋ฅผ ์ด์ฉํ ์กฐ๋ฆฝ์ Slice ํ์
์ง์
๐บ๏ธ ์ด ๋ฌธ์์ ๋ฐฐ๊ฒฝ ์ธ๊ณ๊ด: '์์๋ค ์ปค๋ฎค๋ํฐ'
- ๐ฃ ์์ฒ ( ์ ์
): "๋ฆฌ๋ ๋! ์ด์ ์๋ ค์ฃผ์ ๋๋ก Zustand๋ฅผ ๋์
ํ๋๋ฐ ๋นจ๊ฐ ์ค์ด ๋๋ฌด ๊ทธ์ด์ ธ์.
set(state => ...)ํ ๋ state๊ฐ ์๊พธanyํ์ ์ด๋ผ๊ณ ์๋ฌ๋ฅผ ๋ฑ์ด์, ์ผ๋จ ๊ท์ฐฎ์์// @ts-ignore๋ก์น ํด๋๊ณ ํด๊ทผํ์ต๋๋ค ํํ!" - ๐ฆ ์ํธ ( ๋ฆฌ๋ ): "์์ฒ ๋... ํ๋ก ํธ์๋ ๊ฐ๋ฐ์์๊ฒ
any๋ ๋ง์ฝ๊ณผ๋ ๊ฐ์ต๋๋ค. ๋น์ฅ์ ํธํ์ง๋ง ๋์ค์ ์ ์ง๋ณด์ ํ ๋ ๋ด ์ฝ๋๊ฐ ๋๋ฅผ ์ฐ๋ฅด๋ ์นผ์ด ๋ผ์. Zustand๊ฐ ์ ๊ณตํ๋ ํ์ ์ ๋ค๋ฆญ ๊ตฌ์กฐ๋ง ํ ๋ฒ ๋ฑ ์ดํดํ๋ฉด, ์๋ ์์ฑ(IntelliSense)์ ํฉํํจ์ ๋ง๋ณด๊ฒ ๋ ๊ฒ๋๋ค. ๋นจ๊ฐ ์ค ์ง์ฐ๋ฌ ๊ฐ๋ด ์๋ค."
๐ค ์ ์์์ผ ํ๋๊ฐ
Zustand๋ ์๋ ์ ์๋ฐ์คํฌ๋ฆฝํธ(Vanilla JS)๋ฅผ ์ํด ์์ฃผ ๊ฐ๋ณ๊ฒ ๋์์ธ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ต๋๋ค. TypeScript๋ฅผ ์ง์ํ๊ธด ํ์ง๋ง, ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ create ํจ์์ ๋
ํนํ ๊ตฌ์กฐ์ ์ฌ๋ฌ ๋ฏธ๋ค์จ์ด๋ฅผ ๊ฒน๊ฒน์ด ๊ฐ์ธ๋(Wrapping) ํน์ฑ ๋๋ฌธ์ ํ์
์คํฌ๋ฆฝํธ ์์ง์ด ํ ๋ฒ์ ๋ชจ๋ ํ์
์ ์ถ๋ก ํ์ง ๋ชปํ๋ ๋ณ๋ชฉ ๊ตฌ๊ฐ์ด ์กด์ฌํฉ๋๋ค.
1๋ ์ฐจ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์๊ฐ ๊ฐ์ฅ ๋ง์ด ๊ฒช๋ Zustand์ ์ข์ ๊ตฌ๊ฐ์ด ๋ฐ๋ก "๋ฏธ๋ค์จ์ด ํ๋ ์ถ๊ฐํ๋๋ ์คํ ์ด ์ ์ฒด ํ์ ์ด ๋นจ๊ฐ ๋ถ๋ก ํฐ์ ธ๋ฒ๋ฆฌ๋ ํ์" ์ ๋๋ค. ์ด ๊ณ ๋น๋ง ๋๊ธฐ๋ฉด 5๋ ์ฐจ ๊ฐ๋ฐ์์ฒ๋ผ ๋นํ์๋ ์ธํ๋ผ ์ฝ๋์ ํ์์ ์ธ ์๋ ์์ฑ ๊ฒฝํ์ ๋๋ฃ๋ค์๊ฒ ์ ๊ณตํ ์ ์์ต๋๋ค.
๐๏ธ 1. ์์ฒ ์ด์ ๋ง๋ฒ์ (์ค๋ต) ์ฝ๋
โ ์ ๋ค๋ฆญ ์ง์ ์ฃผ์ ์คํจ (์ค๋ต)
interface MyStore {
count: number;
increment: () => void;
}
// ๐ฃ ์์ฒ : "์ ๋ค๋ฆญ ๋ฐฐ์ ๋ค! create ๋ค์ ๋ถ์ด๋ฉด ๋๊ฒ ์ง?"
const useStore = create<MyStore>((set) => ({
count: 0,
// ๐จ ์๋ฌ ๋ฐ์! set ํ์
์ด ๊ณ ์ฅ ๋๋ฉด์ state๊ฐ unknown ๋๋ any๋ก ๋น ์ง
increment: () => set((state) => ({ count: state.count + 1 })),
}));Zustand์ ํ์
์ ์ธ๋ถ๋ฅผ ๋ฏ์ด๋ณด๋ฉด, create ํจ์๋ ๋ฏธ๋ค์จ์ด ์ฒด์ด๋์ ์ํด ๋ด๋ถ์ ์ผ๋ก ์ปค๋ง(Currying) ์ด๋ผ๋ ๊ตฌ์กฐ๋ก ์ง์ฌ ์์ต๋๋ค. ํจ์๋ฅผ ํธ์ถํ๋ฉด ๋ ๋ค๋ฅธ ํจ์๊ฐ ๋ฐํ๋๋ ํํ์ฃ . ์ ๋ค๋ฆญ์ ๊ทธ๋ฅ <MyStore> ํ๋๋ง ๋์ง๋ฉด ํ์
๊ฒ์ฌ๊ธฐ๊ฐ ๊ธธ์ ์์ต๋๋ค.
โ ์ปค๋ง ํจํด: ๊ดํธ๋ฅผ ๋ ๋ฒ ์น์ธ์ (์ ๋ต)
// ๐ฆ ์ํธ: "create<Type>()() <- ์ด๋ ๊ฒ ๋น ๊ดํธ๋ฅผ ๋จผ์ ํธ์ถํ ๋ค์ ํจ์๋ฅผ ์ฌ์ธ์."
const useStore = create<MyStore>()((set) => ({
count: 0,
// ๐ก ์๋ฒฝํ๊ฒ ์ถ๋ก ๋จ! ์ด์ ๋ง์ฐ์ค ์ฌ๋ฆฌ๋ฉด state.count ๊ฐ number๋ก ์ธ์!
increment: () => set((state) => ({ count: state.count + 1 })),
}));์ด ํ
๋น ()๊ฐ Zustand ํ์ดํ์ ๊ฐ์ฅ ํฐ ์ง์
์ฅ๋ฒฝ์ด์ ํต์ฌ ์ด์ ์
๋๋ค. ์ด ๋น ๊ดํธ๊ฐ ์ ๋ค๋ฆญ ํ์
์ ์ค์ฝํ๋ฅผ ๋ซ์์ฃผ๊ณ , ๋ค์ด์ด ์ค๋ ํ์ดํ ํจ์์ ์จ์ ํ ํ์
์ ๋ฌผ๋ ค์ค๋๋ค.
๐ 2. ํต๊ณก์ ๋ฒฝ: ๋ฏธ๋ค์จ์ด ํํฐ์ ํ์ ์ง์ฅ
์์ฒ ์ด๊ฐ ์ฑ์ ๋ฐ์นญํ๊ณ ๋์ ์ํ ์ถ์ ์ ์ํด devtools๋ฅผ, ์๋ก๊ณ ์นจ ๋ฐฑ์
์ ์ํด persist ๋ฏธ๋ค์จ์ด๋ฅผ ๋์ง๋์ง ๋ถ์ด๊ธฐ ์์ํ์ต๋๋ค.
โ ๋ฏธ๋ค์จ์ด๊ฐ ์ถ๊ฐ๋๋ฉด์ ํฐ์ง๋ ์ฝ๋
import { devtools, persist } from 'zustand/middleware';
// ๐ฃ ์์ฒ : "๋ฏธ๋ค์จ์ด๋ก ์คํ ์ด ๊ฐ์๋๋ ์๊น ๊ธฐ๊ป ๋ง์ถ ํ์
์ด ๋ ๋ค ๋ฐ์ด ๋ฌ์ด์ ใ
ใ
"
const useStore = create<MyStore>()(
devtools(
persist(
(set) => ({
count: 0,
increment: () => set((state) => ({ count: state.count + 1 })),
}),
{ name: 'my-storage' }
)
)
);์๋ฌ๊ฐ ํฐ์ง๋ ์ด์ ๋ ๊ฐ๋จํฉ๋๋ค. ๋ฏธ๋ค์จ์ด ๋ฐ์ค ํ๋๋ฅผ ํฌ์ฅํ ๋๋ง๋ค Zustand ๋ด๋ถ์ ์ผ๋ก ์๊ตฌํ๋ Mutators (๋ณํ๊ธฐ) ์๊ทธ๋์ฒ๊ฐ ๋ฌ๋ผ์ง๊ธฐ ๋๋ฌธ์
๋๋ค. ํ์ง๋ง 5๋
์ฐจ๋ค์ ๋นํฉํ์ง ์๊ณ ๋ง๋ฒ์ ๋น ๊ดํธ ๊ท์น๋ง ๊ธฐ์ตํฉ๋๋ค. "์ ๋ค๋ฆญ์ ๋งจ ์ฒ์ ๋ฑ ํ ๋ฒ๋ง ์ ์ํ๋ค" ๋ ์์น ๋ง์ด์ฃ .
์ ์ฝ๋๋ ์ฌ์ค ๋ฌธ๋ฒ์ ์ผ๋ก ํ๋ฆฐ ๊ฒ ์์ง๋ง, TypeScript 4.x/5.x ํ๊ฒฝ์์ ๊ฐ๋ set ํ๋ผ๋ฏธํฐ๋จ์์ ์๋ฌ๋ก ์๋ณ๋ ๋๊ฐ ์์ต๋๋ค. ( Zustand ๋ฒ์ ์ ๋ฐ๋ผ ๋ค๋ฆ
๋๋ค. )
์ด๋ด ๋ ๊ฐ์ฅ ์ฐ์ํ๊ณ ํ์คํ๊ฒ ํ์
์๋ฌ๋ฅผ ๋ฌด๋ ฅํํ๋ ๋ฐฉ๋ฒ์ด ๋ฐ๋ก StateCreator ๋ฅผ ๋ถ๋ฆฌํด์ ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค.
๐งฉ 3. 5๋
์ฐจ์ ๋น๊ธฐ: StateCreator ๋ก ์ฌ๋ผ์ด์ค ์กฐ๋ฆฝํ๊ธฐ
์ด์ ๊ฐ์ด๋ 03. ์ฌ๋ผ์ด์ค ํจํด ์์ ๋ฑ๋ฑํ ์คํ ์ด๋ฅผ ๊ธฐ๋ฅ๋ณ๋ก ๋ถ๋ฆฌํ๋ ๊ฒ ๊ธฐ์ต๋์๋์?
์ค๋ฌด์์๋ Zustand ํ์
์ ์ค๊ณํ ๋, ์์ฑ ๋จ๊ณ๋ฅผ ๋ ๊ฐ๋ก ๋๋๋๋ค.
- ์ค๊ณ๋ ๊ทธ๋ฆฌ๊ธฐ (
StateCreator): ์ค์ง ํ์ ๊ณผ ์ด๊ธฐ ๊ตฌ์กฐ๋ง ์ ์ - ์กฐ๋ฆฝํ๊ธฐ (
create): ์ฌ๋ฌ ๋ฏธ๋ค์จ์ด ํ๋๋ฅผ ๋ฒ๋ฌด๋ ค์ ์ต์ข ์น์ธ
โ StateCreator ๋ชจ๋ํ ๋ณ๋ฒ (์ต์ข ์ ๋ต ์ฝ๋)
import { create, StateCreator } from 'zustand';
import { devtools, persist } from 'zustand/middleware';
// 1. ํ์
๋ช
์ธ์
interface AuthSlice {
isLogged: boolean;
login: () => void;
}
// 2. ๐ฆ ์ํธ: ์ฌ๋ผ์ด์ค์ ๋ชจ์(๋ผ๋)์ StateCreator๋ก ๊ตณํ๋ฒ๋ฆฝ๋๋ค.
// ์ด๋ ๋ฏธ๋ค์จ์ด ๋ฐฐ์ด ์๋ณ์๋ฅผ ์ ๋ค๋ฆญ ๋ค์ ๋ฌ์์ฃผ๋ฉด ์๋ฒฝํ ํ์
ํธํ์ ์ด๋ฃน๋๋ค.
const createAuthSlice: StateCreator<
AuthSlice,
[["zustand/devtools", never], ["zustand/persist", unknown]]
> = (set) => ({
isLogged: false,
login: () => set({ isLogged: true }, false, "login"), // devtools๋ฅผ ์ํ ์ก์
๋ผ๋ฒจ๋ง "login"
});
// 3. ๋ฉ์ธ ์คํ ์ด ์กฐ๋ฆฝ (TypeScript๊ฐ ๋ ์ด์ ํผ๋์ ๊ฒช์ง ์์ต๋๋ค)
export const useAuthStore = create<AuthSlice>()(
devtools(
persist(createAuthSlice, { name: 'auth-storage' })
)
);์ด ํจํด์ ํต์ฌ์, "ํ์
์คํฌ๋ฆฝํธ์๊ฒ ๋ด๊ฐ ์์ผ๋ก ์ด ๋ผ๋์ ๋ฌด์จ ๋ฏธ๋ค์จ์ด(devtools, persist)๋ฅผ ๋ฐ๋ฅผ ๊ฑด์ง ์ ๋ค๋ฆญ์ผ๋ก ๋ฏธ๋ฆฌ ๊ท๋ธ์ ํด๋๋ ๊ฒ" ์
๋๋ค. [["zustand/devtools", never], ["zustand/persist", unknown]] ์ด ๋ค์ ํฌ๋ฐํด ๋ณด์ผ ์ ์์ง๋ง, ๊ณต์ ๋ฌธ์์์ ๊ถ์ฅํ๋ ๊ฐ์ฅ ๋นํ์๋ ๋ฏธ๋ค์จ์ด ํ์ดํ ์ ๋ต์
๋๋ค.
๐ ๋ง๋ฌด๋ฆฌ ํด์ฆ
Q1. Zustand์ create ํจ์์ ์ ๋ค๋ฆญ ํ์
์ ์ฃผ์
ํ ๋ ์ฌ๋ฐ๋ฅธ ๋ฌธ๋ฒ์ ๋ฌด์์ธ๊ฐ์?
- A)
create<MyStore>((set) => ...) - B)
create((set) => ...)<MyStore> - C)
create<MyStore>()((set) => ...) - D)
create<MyStore>()
โ
์ ๋ต: C
๐ก ์์ธ ํด์ค:
- ์๋ฆฌ ์ค๋ช
: Zustand์
createํจ์๋ ์ปค๋ง(Currying) ํจํด์ผ๋ก ์์ฑ๋์ด ์์ด, ๋น ๊ดํธ()๋ฅผ ํ ๋ฒ ๋ ํธ์ถํด์ ํ์ ์ถ๋ก ๋ฒ์๋ฅผ ๋ซ์์ฃผ์ด์ผ ๋ค๋ฐ๋ผ์ค๋ ํ์ดํ ํจ์ ์ฝ๋ฐฑ์์ ์ํ(state)์ ํ์ ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์ถ๋ก ๋ฉ๋๋ค. - ์ค๋ต ํผ๋๋ฐฑ: "์์ฒ ๋, A๋ฒ์ฒ๋ผ ์ฐ๋ฉด
set๋ด๋ถ์์ ํ์ ์คํฌ๋ฆฝํธ๊ฐ ๊ธธ์ ์๊ณany์์น๋ฅผ ๋ฒ์ด๊ฒ ๋ฉ๋๋ค. ๋น ๊ดํธ ํ๋๊ฐ ์๋ ์์ฑ์ ์ด๋ ค์ค๋๋ค!" - ๐ ํต์ฌ ๊ธฐ์ต๋ฒ: ๐ฆ ์ํธ: "์ ๋ค๋ฆญ์ ์ผ์ผ๋ฉด, ๋น ๊ดํธ๋ก ํ ๋ฒ ์ฌ๊ณ ๊ฐ์ผ ์ฝ๋๊ฐ ์ ๊นจ์ง๋๋ค."
Q2. ์ฌ๋ผ์ด์ค ํจํด์ ๊ตฌํํ๊ฑฐ๋ ๋ฏธ๋ค์จ์ด๋ฅผ ์ฌ๋ฌ ๊ฐ ๊ฒน์น ๋ ํ์ ๋ถ๊ดด๋ฅผ ๋ง๊ธฐ ์ํด Zustand๊ฐ ๊ถ์ฅํ๋ ํ์ ํฌํผ๋ ๋ฌด์์ธ๊ฐ์?
- A)
CombineState - B)
StateCreator - C)
StoreApi - D)
ZustandSlice
โ
์ ๋ต: B
๐ก ์์ธ ํด์ค:
- ์๋ฆฌ ์ค๋ช
: ๋ฏธ๋ค์จ์ด๊ฐ ์ถ๊ฐ๋ ๋๋ง๋ค ์๊ตฌํ๋ ํ์
์๊ทธ๋์ฒ๊ฐ ๋ณ๋๋๋๋ฐ, ์คํ ์ด ์ ์ ๋ผ๋ ์์ฒด๋ฅผ
StateCreator๋ก ๋ฏธ๋ฆฌ ํ์ ์ ์ธํด๋๋ฉดcreateํจ์ ๋ด๋ถ์์ ๋ฏธ๋ค์จ์ด๋ฅผ ์๋ฌด๋ฆฌ ๊ฐ์ธ๋ ํ์ ์ด ๊ฒฌ๊ณ ํ๊ฒ ์ ์ง๋ฉ๋๋ค. - ์ค๋ต ํผ๋๋ฐฑ: "์์ฒ ๋, ๋ฏธ๋ค์จ์ด ๋๋ฌธ์ ๋นจ๊ฐ ๋ถ์ด ๋ค์ด์จ๋ค๋ฉด ์คํ ์ด ๋ก์ง์ ๋ฐ์ผ๋ก ๋นผ์
StateCreator๋ก ์ท์ ๋จผ์ ์ ํ์ฃผ์ธ์." - ๐ ํต์ฌ ๊ธฐ์ต๋ฒ: ๐ฆ ์ํธ: "StateCreator๋ Zustand ์คํ ์ด์ ๋ฌด์ ๋ฐฉํจ์ ๋๋ค."
Q3. ๐๏ธโโ๏ธ ์์ฒ ์ ํ ์คํธ ํ์ (Q&A)
์์ฒ ์ด๊ฐ Slice ํจํด์ผ๋ก
์ ์ ์คํ ์ด์์ฅ๋ฐ๊ตฌ๋ ์คํ ์ด๋ ๊ฐ๋ฅผ ๊ฒฐํฉํ์ฌ ๊ฑฐ๋ํuseBoundStore๋ฅผ ๋ง๋ค๋ ค๊ณ ํฉ๋๋ค. ๋์ด ํ์ ์ ์ ๋๋ก ํฉ์น๋ ค๋ฉด ๋ฉ์ธ ์คํ ์ด์createํจ์ ์ ๋ค๋ฆญ์ ์ด๋ป๊ฒ ์ ์ด์ค์ผ ํ ๊น์?
โ
์ ๋ต: create<UserSlice & CartSlice>()(...) ์ฒ๋ผ ์ธํฐ์น์
(&)์ ์ฌ์ฉํ๋ค.
๐ก ์์ธ ํด์ค:
- ์๋ฆฌ ์ค๋ช
: ๊ฐ์ฒด ์ธํฐํ์ด์ค๋ค์ ํ๋๋ก ์ตํฉํ ๋๋ TypeScript์ ์ธํฐ์น์
ํ์
(&) ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค. Zustand์ ๋ฉ์ธ ์คํ ์ด๋ ๊ฐ ์ฌ๋ผ์ด์ค๋ค์ด ์ ๊ณตํ๋ ์ํ์ ์ก์
๋ฉ์๋๊ฐ ํฉ์ณ์ง ๊ฑฐ๋ํ ํ๋์ ๊ฑฐ์ธ ๊ฐ์ฒด๊ฐ ๋ฉ๋๋ค. ๋ฐ๋ผ์
UserSlice & CartSlice๊ฐ ๋์ด์ผ ์คํ ์ด ๋ด๋ถ์์state.userName๊ณผstate.cartItems๋ฅผ ๋ชจ๋ ์๋ ์์ฑ๋ฐ์ ์ ์์ต๋๋ค. - ์ค๋ต ํผ๋๋ฐฑ: "์์ฒ ๋,
| (Union)๋ฅผ ์ฐ๋ฉด ์ ์ ์คํ ์ด ๊ฑฐ๋ ์ฅ๋ฐ๊ตฌ๋ ๋ ์ค ํ๋๋ ์๋ฆฌ๋๊น ๊ต์งํฉ ์ฑ์ง์ ์ํด ๋ ๋ค ๊ณตํต์ผ๋ก ๊ฐ์ง ํ๋กํผํฐ(๊ฑฐ์ ์์)๋ง ์ธ ์ ์๊ฒ ๋ผ์. ๋ฌด์กฐ๊ฑด&๋ก ํฉ์น์ธ์!" - ๐ ํต์ฌ ๊ธฐ์ต๋ฒ: ๐ฆ ์ํธ: "์ฌ๋ผ์ด์ค๋ ๊ฐ๋ณ
StateCreator<์์ ํ์ >, ํฉ์น๋ ๊ณต์ฅ์create<A & B & C>()"
๐ฃ ์์ฒ ์ด์ ํด๊ทผ ์ผ๊ธฐ
์ค๋๋ ์ํธ ๋ฆฌ๋ ๋์ด ๋ด ๋ฑ์ง์ ๋๋ ธ๋ค. // @ts-ignore ๋ฅผ ์คํ ์ด ํ์ผ ์์ค์ 10๊ฐ๋ ๋ฌ์๋์ ๊ฑธ ๋ค์ผฐ๊ธฐ ๋๋ฌธ์ด๋ค. ํ์ง๋ง ์ค๋ Zustand ํ์
์ ์ธ๋ฒ์ ์ ๋๋ก ๋ฐฐ์ฐ๊ณ ๋๋๊น, VSC์์ ์์ฑ๊ฐ์ ํ์ดํํ ๋๋ง๋ค ๋ฐ๋ก ๋ํ๋๋ ์๋ ์์ฑ์ ๋ณด๋ฉฐ ๋๋ฌผ์ด ๋ ๋ปํ๋ค. ์ด๋์ ๋ค๋ค TypeScript๋ฅผ ์ฐ๋๊ตฌ๋! ์ ๋ค๋ฆญ ๊ดํธ๊ฐ ์ข ์ง๊ทธ๋ฌ์ ๋ณด์ผ ๋๋ ์์ง๋ง, ํ๋ฒ ์ธํ
ํด๋๋ฉด 1๋
์ ํธํ๋ค๋ ๋ง์ด ์ง์ง์ธ ๊ฒ ๊ฐ๋ค. ๋ด ์คํ ์ด์๋ ์ด์ '์์ ์ ์ผ' ๋ฑ์ง๊ฐ ๋ถ์๋ค!
๐ก "
create<Type>()(...)๋น ๊ดํธ์ ๋ง๋ฒ์ ์์ง ๋ง์. ๋ฏธ๋ค์จ์ด๊ฐ ๋ ๋๋ StateCreator๋ก ๋ผ๋๋ถํฐ ํํํ ๋ง๋ค์."