首页 > 解决方案 > 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'

标签: typescriptreduxreselect

解决方案


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

您可以跳过返回类型,并且Parametersand ReturnType(两者都已定义,因此不要重新定义它们)对于完整类型的版本并不是必需的:

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

不知道这如何相互作用createSelectorCreator


推荐阅读