extends Function with Parameters 和 ReturnType 的正确用法是什么

What is the correct usage of extends Function with Parameters and ReturnType

我正在尝试为重新选择创建自己的记忆功能。我不得不重新定义 ParametersReturnType 以接受 extends Function(错误?)。 myMemoize 的签名是正确的,但内部函数签名未编译。

import { createSelectorCreator } from "reselect";

type Parameters<T extends Function> = T extends (...args: infer P) => any ? P : never;
type ReturnType<T extends Function> = T extends (...args: any[]) => infer R ? R : any;

function myMemoize<F extends Function>(func: F): F {
  // ...
  return function(...args: Parameters<F>): ReturnType<F> {
    //...
    return func.apply(null, args)
  }
}

export const createMyMemoizeSelector = createSelectorCreator(myMemoize)

错误:

error TS2322: Type '(...args: Parameters<F>) => ReturnType<F>' is not assignable to type 'F'

Type '(...args: Parameters<F>) => ReturnType<F>' is not assignable to type 'F'

从根本上说 ...args 意味着任何数量的参数,而 F 可能需要非常具体的计数。

修复

您的用例不需要 Prameters / ReturnType,因为 (func: F): F 涵盖外部类型安全,您不需要内部类型安全。这是更简单的方法:

function myMemoize<F extends Function>(func: F): F {
  // ...
  return function(...args: any[]): any {
    //...
    return func.apply(null, args)
  }
}

问题是您的新函数与原来的函数类型不同。原始文件可能有额外的属性,您不会将其转发给 return 函数。

你可以跳过 return 类型,而且 ParametersReturnType (两者都已定义,所以不要重新定义),对于一个全打字版:

function myMemoize<P extends any[], R>(func: (...a:P)=> R): (...a:P)=> R {
  // ...
  return function(...args: P): R {
    //...
    return func.apply(null, args)
  }
}

但不确定这与 createSelectorCreator 的交互方式。