1. μ ν¨ν μν
ν¨κ³Όμ μΌλ‘ νμ μ μ€κ³νκΈ° μν΄μ, μ ν¨ν μνλ§ ννν μ μλ νμ μ λ§λ€μ΄ λ΄λ κ²μ΄ κ°μ₯ μ€μνλ€. μ¬κΈ°μ λ§νλ μ ν¨ν μνλ 무μμΌκΉ? μ ν¨μ μ¬μ μ μλ―Έλ₯Ό μ΄ν΄λ³΄λ©΄ λ€μκ³Ό κ°λ€.
ν¨λ ₯μ΄λ ν¨κ³Όκ° μμ.
μ¦, ν¨λ ₯μ΄λ ν¨κ³Όκ° μλ μνκ° μ ν¨ν μνλΌκ³ ν μ μλ€. νλ‘κ·Έλλ° κ΄μ μμ μ΄ν΄λ³΄λ©΄ μ΄λκ°μ μ¬μ©λ μ μλ μνμ΄λ€. λ€μκ³Ό κ°μ μνκ° μλ€.
interface State {
a: string;
b: string;
c?: string;
d?: string;
}
μ΄μ κ°μ μνλ λ€μκ³Ό κ°μ΄ μ¬λ¬ κ°μ§ μνλ₯Ό ν¬ν¨νλ€.
interface StateOne {
a: string;
b: string;
}
interface StateTwo {
a: string;
b: string;
c: string;
}
interface StateThree {
a: string;
b: string;
d: string;
}
interface StateFour {
a: string;
b: string;
c: string;
d: string;
}
μ΄ μ€ λ΄κ° μνλ νμ μ΄ StateOne, StateTwo, StateThreeλΌλ©΄ StateFourλ 무ν¨ν μνκ° λλ€. κ·Έλ¬λ―λ‘ μλ¨μ μμ±ν State Typeμ 무ν¨ν μνλ₯Ό ν¬ν¨νκΈ° λλ¬Έμ νΌλμ μ΄λνκΈ° μ½κ³ μ€λ₯λ₯Ό μ λ°νκ² λλ€.
1-2. 무ν¨ν μνμμ λ²μ΄λκΈ°
μμμ μ΄ν΄λ³Έ 무ν¨ν μνμμ λ²μ΄λκΈ° μν΄μ νκ·Έλ μ λμ¨μ μ¬μ©νλ©΄ λλ€. νκ·Έ λ μ λμ¨μ΄λ? νΉμ μμ±μ ν΅ν΄ κ°μ΄ μνλ λΈλμΉλ₯Ό μλ³ν μ μλ μ λμ¨μ΄λ€. μλμ μμμμ type μμ±μ΄ μλ³μ λλ νκ·ΈλΌ λΆλ¦°λ€.
interface StateOne {
type: 'one';
a: string;
b: string;
}
interface StateTwo {
type: 'two';
a: string;
b: string;
c: string;
}
interface StateThree {
type: 'three';
a: string;
b: string;
d: string;
}
type State = StateOne | StateTwo | StateThree;
μ΄λ‘μ¨ State νμ μ μ μν μνλ§ νννλ νμ μ΄ λλ€.
2. μΉ μ ν리μΌμ΄μ μ νμ΄μ§ μν μμ
2-1. 무ν¨ν μνλ₯Ό ν¬ν¨ν μν
μ΄λ€ μΉ μ ν리μΌμ΄μ μμ νμ΄μ§λ₯Ό μ ννλ©΄, νμ΄μ§μ λ΄μ©μ λ‘λνκ³ νλ©΄μ νμνλ€. μ΄λ νμ΄μ§μ μνλ λ€μκ³Ό κ°λ€.
interface State {
pageText: string;
isLoading: boolean;
error?: string;
}
2-2. μ ν¨ν μνλ§ ν¬ν¨ν μν
λ€μμ νκ·Έλ μ λμ¨μ μ¬μ©νμ¬ μ ν¨ν μνλ§ ν¬ν¨νλλ‘ λ¦¬ν©ν°λ§ ν μ½λμ΄λ€. μ΄λ state μμ±μ΄ μλ³μ(νκ·Έ)κ° λλ€.
interface RequestPending {
state: 'pending';
}
interface RequestError {
state: 'error';
error: string;
}
interface RequestSuccess {
state: 'ok';
pageText: string;
}
type RequestState = RequestPending | RequestError | RequestSuccess;
interface State {
currentPage: string;
requests: { [page: string]: RequestState };
}
μμ νμ μ μ¬μ©ν changePage ν¨μλ λ€μκ³Ό κ°λ€.
async function changePage(state: State, newPage: string) {
state.requests[newPage] = { state: 'pending' }; // pending μνλ‘ λ³κ²½
state.currentPage = newPage;
try {
const response = await fetch(getUrlForPage(newPage));
if (!response.ok) {
throw new Error(`Error: μλ¬ λ°μ`);
}
const pageText = await response.text();
state.requests[newPage] = { state: 'ok', pageText }; // ok μνλ‘ λ³κ²½
} catch (error) {
state.requests[newPage] = { state: 'error', error: String(error) }; // error μνλ‘ λ³κ²½
}
}
changePage ν¨μ λ΄μμ state μ κ°μ λ°λΌ μνκ° λ°λλ κ²μ λ³Ό μ μλ€. λ μ΄μ λΆνμν μνμΈ λ¬΄ν¨ν μνλ₯Ό ν¬ν¨νμ§ μκ² λλ€.
3. κ²°λ‘
- νμ μ μ€κ³ν λ, μ΄λ€ κ°λ€μ ν¬ν¨νκ³ μ΄λ€ κ°λ€μ μ μΈν μ§ μ μ€νκ² μκ°ν΄μΌ νλ€.
- 무ν¨ν μνκ° μλ νμ μ νΌλμ μ΄λνκΈ° μ½κ³ μ€λ₯λ₯Ό μ λ°νκ² λλ€.(λͺ©μ¨λ μνλ‘λ€.)