공부기록/Typescript
# 65 Context Api 타입지정
Jenner
2023. 11. 16. 02:07
베이스 셋업
import { createContext } from "react";
type Timer = {
name: string;
duration: number;
};
type TimersState = {
isRunning: boolean;
timers: Timer[];
};
type TimersContextValue = TimersState & {
addTimer: (timerData: Timer) => void;
startTimers: () => void;
stopTimers: () => void;
};
const TimersContext = createContext<TimersContextValue | null>(null);
초기에는 null값이 들어감 그래서 (null)
Header컴포넌트에서 TimersContext에 접근
접근할 때는 value에 정의된 대로
상황에 맞게 값을 설정해야 하므로
null이 되면 안되는 상황 체크
방법 1. 타입스크립트에게 알려줌 !느낌표로
import { useContext } from "react";
import { TimersContext } from "../store/timers-context.tsx";
import Button from "./UI/Button.tsx";
export default function Header() {
const timersCtx = useContext(TimersContext)!;
return (
<header>
<h1>ReactTimer</h1>
<Button>Stop Timers</Button>
</header>
);
}
방법 2. null체크하는 부분 커스텀훅으로 만들기
export const useTimersContext = () => {
const timersCtx = useContext(TimersContext);
if (timersCtx === null) {
throw new Error("TimersContext is null - that should not be the case");
}
return timersCtx;
};
이렇게 되면
Header에서 사용하는 timersCtx가 null이 될 수없다는 것을 타입스크립트에게 알리게 됨
그래서 Header에서 확인작업을 거치지 않아도 됨.
import { useTimersContext } from "../store/timers-context.tsx";
import Button from "./UI/Button.tsx";
export default function Header() {
const timersCtx = useTimersContext();
return (
<header>
<h1>ReactTimer</h1>
<Button>{timersCtx.isRunning ? "stop" : "Start"} Timers</Button>
</header>
);
}