"Hooks are typed by React itself. Your job is to give them the right initial values."
useState typing
useState infers the state type from its initial value. useState(0) is [number, Dispatch<SetStateAction<number>>]. useState('hi') is [string, ...]. When the initial value is too narrow (null, undefined) or you want a union, pass an explicit generic: useState<User | null>(null).
useReducer typing
useReducer's typing comes from the reducer signature. function reducer(state: State, action: Action): State { ... }. useReducer(reducer, initialState) infers both state and action types from the reducer. Discriminated unions on Action give you exhaustive case checking inside the reducer.
Custom hooks
A custom hook is a function whose name starts with use and which calls other hooks. Type it like any other function. function useUser(id: number): { user: User | null; loading: boolean }. Return tuples for state+setter pairs: function useCounter(initial: number): [number, () => void].
any somewhere. Trace back to find where, fix that, and the types flow correctly through the rest.