繁体   English   中英

如何声明一个通用 function 返回一个 function (反应挂钩),其参数相同但返回类型与其参数不同

[英]How to declare a generic function that returns a function (react hook) with same parameters but different return type from its parameter

在 TypeScript 中,如何声明遵循上述规则的 function f

f是 function :

  • 将另一个 function回调作为参数;
  • 返回不同的 function钩子
  • 其中hook接受与callback相同的参数,但具有不同的返回类型

强调“不同的返回类型” ...

我的具体目标是键入我实现的 React Hook,但我的问题与钩子本身无关。 相反,它与类型声明有关。

我非常接近解决方案,但仍有一个缺失的部分......基于this answer from a different but similar question ,我能够正确地覆盖参数向 function 添加类型提示,但这种方法在于返回类型:

这是我的代码:

import { useRef } from 'react';

export default function useTimeoutDebounce<F extends Function>(callback: F, ms: number): F {
    const timeout = useRef<number>();
    const timeoutDebounce = (...args: any[]) => {
        if (typeof window !== 'undefined') {
            window.clearTimeout(timeout.current);
            timeout.current = window.setTimeout(() => {
                callback(...args)
            }, ms);
        }
    };

    // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
    return <any>timeoutDebounce;
}

有了该代码,我就可以像这样使用它:

useTimeoutDebounce 与类型提示一起使用

请注意,TypeScript 成功检查了参数的类型! 伟大的!

但是,看看这个另一个例子, (这是我想要改变的行为)

回调函数返回布尔值的示例

请注意,钩子的返回类型是boolean ,这是一个谎言。 正如你在钩子声明中看到的,它是一个 void function。

我在考虑长远。 有关于 function 的返回类型的类型提示最终会在维护代码时导致问题。

Ps:我查看了Parameters实用程序类型,但我无法使其适用于我的情况,因为它不适用于Function

文档中:

type T7 = Parameters<Function>;
Type 'Function' does not satisfy the constraint '(...args: any) => any'.
  Type 'Function' provides no match for the signature '(...args: any): any'.

我想解决方案看起来像这样(我把它写成我认为是您问题的最小可重现示例)。

在下面的案例中,您可以看到 aToC function 是从 aToB function 构造的,它最终具有相同的参数签名但返回值不同。 有一个typescript 操场,它显示它编译在那里你可以 hover 通过 aToC 检查类型并从那里进行实验。

type A = "A";
type B = "B";
type C = "C";

function retypeFunction<Params extends any[]>(fun: (...params:Params) =>B) : (...params:Params) =>C {
    return (...params:Params) => "C"
}

function aToB(a:A):B{
   return "B"; 
}

const aToC = retypeFunction(aToB);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM