为偏函数生成类型
Generate type for partial function
我有一个声明类型的函数。我打算使用此功能的部分版本。但是我需要先为部分版本声明变量。
我可以复制签名,省略第一个参数。
虽然它可以工作并进行类型检查,但我想将其自动化。
这就是我想要的使用方式:
function myFunc(a: number, b: number): number {
return a + b
}
let partFunc: PartialFunc<typeof myFunc>
// later
partFunc = (b) => myFunc(42, b)
而且我不知道是否可以创建 PartialFunc<Func>
通用。
我试过这个方法
interface Func1<T1, TRes> {
(a: T1): TRes
}
interface Func2<T1, T2, TRes> {
(a: T1, b: T2): TRes
}
interface PartialFunc<TFunc extends Func2<T1, T2, TRes>, T1=any, T2=any, TRes=any> extends Func1<T2, TRes>{}
或与通用类型相同:
type F1<T1, TRes> = (a: T1) => TRes
type F2<T1, T2, TRes> = (a: T1, b: T2) => TRes
type PF<Func extends F2<T1, T2, TRes>, T1=any, T2=any, TRes=any> = F1<T2, TRes>
但这仍然需要我指定所有类型:
let partFunc: PF<typeof myFunc, number, number, number>
否则我有 any
类型。
虽然这会强制执行类型检查,例如它不会接受 PF<typeof myFunc, number, number, string>
,我想避免再次编写类型。
基本上我想对 TS 说 取这个函数的签名并删除第一个参数
有解决办法吗?
此任务的上下文 - 我有一个 react-redux
应用程序,我想将参数从商店绑定到操作调度程序。
在 TypeScript 2.8 及更高版本中,您可以使用 conditional types to do this, by leveraging the awesome type inference in conditional types 功能。以下是您在这种特定情况下可以如何使用它:
type RemoveFirstParamFromTwoParamFunction<F extends (a: any, b: any)=>any> =
F extends (a: any, b: infer B) => infer R ? (b: B) => R : never
function myFunc(a: number, b: number): number {
return a + b
}
let partFunc: RemoveFirstParamFromTwoParamFunction<typeof myFunc>;
partFunc = (b) => myFunc(42, b);
注意这只适用于恰好两个必需参数的具体函数。如果您需要它处理 more/fewer 个可能可选参数的可能泛型函数,您将不得不更加努力地通过枚举案例和彻底测试来完成它。那是因为 TypeScript 当前(从 TypeScript 2.8 开始)缺少 a way to programmatically access function parameters。您需要的 RemoveFirstParam<>
的确切类型取决于您的用例。
希望对您有所帮助。祝你好运。
我有一个声明类型的函数。我打算使用此功能的部分版本。但是我需要先为部分版本声明变量。
我可以复制签名,省略第一个参数。
虽然它可以工作并进行类型检查,但我想将其自动化。
这就是我想要的使用方式:
function myFunc(a: number, b: number): number {
return a + b
}
let partFunc: PartialFunc<typeof myFunc>
// later
partFunc = (b) => myFunc(42, b)
而且我不知道是否可以创建 PartialFunc<Func>
通用。
我试过这个方法
interface Func1<T1, TRes> {
(a: T1): TRes
}
interface Func2<T1, T2, TRes> {
(a: T1, b: T2): TRes
}
interface PartialFunc<TFunc extends Func2<T1, T2, TRes>, T1=any, T2=any, TRes=any> extends Func1<T2, TRes>{}
或与通用类型相同:
type F1<T1, TRes> = (a: T1) => TRes
type F2<T1, T2, TRes> = (a: T1, b: T2) => TRes
type PF<Func extends F2<T1, T2, TRes>, T1=any, T2=any, TRes=any> = F1<T2, TRes>
但这仍然需要我指定所有类型:
let partFunc: PF<typeof myFunc, number, number, number>
否则我有 any
类型。
虽然这会强制执行类型检查,例如它不会接受 PF<typeof myFunc, number, number, string>
,我想避免再次编写类型。
基本上我想对 TS 说 取这个函数的签名并删除第一个参数
有解决办法吗?
此任务的上下文 - 我有一个 react-redux
应用程序,我想将参数从商店绑定到操作调度程序。
在 TypeScript 2.8 及更高版本中,您可以使用 conditional types to do this, by leveraging the awesome type inference in conditional types 功能。以下是您在这种特定情况下可以如何使用它:
type RemoveFirstParamFromTwoParamFunction<F extends (a: any, b: any)=>any> =
F extends (a: any, b: infer B) => infer R ? (b: B) => R : never
function myFunc(a: number, b: number): number {
return a + b
}
let partFunc: RemoveFirstParamFromTwoParamFunction<typeof myFunc>;
partFunc = (b) => myFunc(42, b);
注意这只适用于恰好两个必需参数的具体函数。如果您需要它处理 more/fewer 个可能可选参数的可能泛型函数,您将不得不更加努力地通过枚举案例和彻底测试来完成它。那是因为 TypeScript 当前(从 TypeScript 2.8 开始)缺少 a way to programmatically access function parameters。您需要的 RemoveFirstParam<>
的确切类型取决于您的用例。
希望对您有所帮助。祝你好运。