typescript - extends Function with Parameters and ReturnType的正确用法是什么
问题描述
我正在尝试为重新选择创建自己的记忆功能。我不得不重新定义Parameters
并ReturnType
接受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'
解决方案
问题是您的新功能与原来的类型并不相同。原始文件可能具有额外的属性,您不会将其转发给返回函数。
您可以跳过返回类型,并且Parameters
and 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
。
推荐阅读
- reactjs - 使用 React 钩子时无法重新渲染引导表
- android - 如何在不消失约束布局中的组件的情况下使用高程?
- python - MT5/Metatrader 5 使用 python 连接到不同的 MT5 终端
- android - AdMob 仅显示测试广告,而非真实广告
- typescript - 将数据传递给根 Vue 类组件
- rust - 如何销毁范围内的引用?
- postgresql - 生成缺失的数据并填写 - postgresql
- java - 如何处理其父类中的@Autowire 对象?
- javascript - D3.js 将圆圈添加到折线图上的每个其他点
- excel - IF公式怎么用?