Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

Really well said.

And if you really wanted to make it 'pure', you could easily write a hook with an explicit return type that wraps the type of the initial value. If you're using typescript, you can then limit the possible types of the generic to only monads.

    type State<T> = val as T;

    const useStatex = <T>(initialState: T) => {
        const [state, setState] = useState(initialState);
        return [state, updateState] as [State<T>, (val: T) => void];
    }
This new hook, useStatex, has an explicit type definition that indicates something stateful is taking place. Same as Futures. You can take this even further in the typing limiting the generic to only allow certain types for the underlying values to be monads, or even more simply

    type State<T> = Promise<T> | Array<T> | Option<T>
So you avoid an extra layer of nesting like

    State<Future<Array<T>>>
Point is, there are lots of ways to easily resolve any its not pure! arguments same as any other functional programming concept

eta

The simplest way to limit the return type might even be to just do this

    const useStatex = <T extends Promise | Array | Option>(initialState: T) => {


Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: