问题描述
我即将学习一些类型化函数式编程,所以刚开始实现部分应用程序 - 这应该是类型安全的。
问题:我正在尝试创建一个函数,该函数将一个函数及其零个或所有参数作为参数。
所以我从那个界面开始
interface Functor {
(...args: any[]) => any
}
又来到了这个函数:
const partial = <T extends Functor>(fx: T,...apply: Parameters<T>): Functor =>
(...args: any[]) => fx(...apply,...args);
这里的问题是,...args: Parameter<T>
指示打字稿要求 所有 参数,但我希望允许 全部为零
有没有办法做到这一点?
解决方法
您可以定义类似于内置 PartialParameters
的 Parameters
实用程序:
type PartialParameters<T> = T extends (...args: infer P) => any ? Partial<P> : never;
const partial = <T extends Functor>(fx: T,...apply: PartialParameters<T>): Functor =>
(...args: any[]) => fx(...apply,...args);
declare function foo(a: string,b: number): boolean;
partial(foo)
partial(foo,'1')
partial(foo,'1',1)