const foo = useSelector((state: RootState) => state.foo);
useEffect(() => {
// ...
}, [foo.name, foo.title]);
Can you specify properties of something returned by useSelector, or should I just put foo itself in the invalidation list for useEffect here?
That's just fine. The only real requirement for what's in a dependency array is that each value is stateful or a prop passed down from a parent component - so, go ahead and use [foo.name, foo.title]. (Using [foo] instead might capture more changes than you're expecting, because that'll run the effect whenever anything in foo changes, and not just the name or title)