Я решил эту проблему в некоторых своих проектах, создав строго типизированную оболочку вокруг useSelector
, которая мне нужна взамен.
// selectors.ts
import { useSelector as reduxUseSelector } from 'react-redux'
import { StoreState } from './store'
/** Application specific strongly typed wrapper around redux's useSelector(). */
export function useSelector<T>(fn: (state: StoreState) => T): T {
return reduxUseSelector(fn)
}
Теперь вы можете просто сделать:
import { useSelector } from './selectors'
function Component() {
const foo = useSelector(state => state.foo) // state is typed here
//...
}
И я бы сказал, что selectUser
вместо этого должен быть ловушкой, которая вызывает эту версию useSelector
для вас.
import { useSelector } from './selectors'
export function useCurrentUser(): User {
return useSelector(state => state.user)
}
function Component() {
const user = useCurrentUser()
//...
}