1. 커스텀 훅과 공급자 컴포넌트 만들기

type CountContextType = [
	number,
	Dispatch<SetStateAction<number>>
]

const Count1Context = createContext<CountContextType | null>(null);
export const Count1Provider = ({children} : {children : ReactNode}) => (
	<Count1Context.Provider value={useState(0)}>
			{children}
	</Count1Context.Provider>
)
export const Count1Provider = ({children} : {children : ReactNode}) => {
	
	const [count, setcount] = useState(0);
	return (
	<Count1Context.Provider value={[count, setcount]}>
			{children}
	</Count1Context.Provider>
	)
}
export const useCount1 = () => {
	const value = useContext(Count1Context);
	if(value === null) throw new Error("Provider missing");
	return value;
}

2. 컴포넌트 훅이 있는 팩토리 패턴

export const createStateContext = (
	// 1. useState를 콜백함수로 받음
	useValue : (initialValue) => State,
) => {
	// 2. 컨텍스트 생성
	const StateContext = createContext(null);

	
	// 3. Provider 생성
	const StateProvider = ({initialValue, children}) => (
		<StateContext.Provider value={useValue(initialValue)}>
			{children}
		</StateContext.Provider>
	)
	
	// 4. 공급자 커스텀 훅 생성
	const useContextState = () => {
		const value = useContext(StateContext);
		if(value === null) throw new Error('Provider Missing');
		return value;
	};
	
	// 5. 반환 값 설정
	return [StateProvider, useContextState] as const;
}
// 이 initialState는 사용자측 Provider에서 넘기는 initalValue가 들어간다. 
export const useNumberState = (initialValue) => useState(initialValue || 0);