我想键入useStateUpdater
阵营挂钩,这将需要一个初始状态和咖喱功能,将提供中,首先,目前的状态,二是一个可选的参数。
有效的用法是:
const [state, toggle] = useStateUpdater(false, bool => () => !bool);
toggle();
console.log(state); // true
要么
const [str, append] = useStateUpdater('foo', str => more => str + more);
append('bar');
console.log(str); // 'foobar'
这是我的钩码,与我能到目前为止定义的类型:
// @flow
import { useState } from 'react';
type UseStateUpdater = <S, U>(
initialState: (() => S) | S,
updater: U
) => [S, any => void];
const useStateUpdater: UseStateUpdater = ((initialState, updater) => {
const [state, setState] = useState(initialState);
return [state, (...args) => setState(state => updater(state)(...args))];
}: any);
export default useStateUpdater;
一切工作正常,但问题是,在目前,返回updater
函数any
作为参数类型。
我想它有作为参数输入类型U
型的,在第二功能。
useStateUpdater(S, S => ARGS => S);
^
How do I reference this?
由于伪代码,类型应该是这样的:
type UseStateUpdater = <S, U>(
initialState: (() => S) | S,
updater: U
) => [S, (...args: $Arguments<$ReturnType<typeof U>>) => void];
想法?
我想出如何键入:
// @flow
import { useState } from 'react';
type UseStateUpdater = <S, U>(
initialState: (() => S) | S,
updater: S => U => S
) => [S, U => void];
const useStateUpdater: UseStateUpdater = ((initialState, updater) => {
const [state, setState] = useState(initialState);
return [state, (...args) => setState(state => updater(state)(...args))];
}: any);
export default useStateUpdater;