检索函数参数类型的流量

问题描述 投票:0回答:1

我想键入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];

想法?

javascript reactjs flowtype
1个回答
0
投票

我想出如何键入:

// @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;
© www.soinside.com 2019 - 2024. All rights reserved.