extends Function with Parameters 和 ReturnType 的正确用法是什么
What is the correct usage of 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'
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 类型,而且 Parameters
和 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
的交互方式。
我正在尝试为重新选择创建自己的记忆功能。我不得不重新定义 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'
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 类型,而且 Parameters
和 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
的交互方式。