代码之家  ›  专栏  ›  技术社区  ›  Fez Vrasta

使用流检索函数参数类型

  •  0
  • Fez Vrasta  · 技术社区  · 5 年前

    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];
    

    思想?

    1 回复  |  直到 5 年前
        1
  •  0
  •   Fez Vrasta    5 年前

    我想出了如何键入它:

    // @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;