Igo*_*gor 1 generics typescript typescript-generics typescript-typings
我有一个声明类型的函数。我计划使用此功能的部分版本。但是我需要先为部分版本声明变量。
我可以复制签名,省略第一个参数。
虽然它可以工作并进行类型检查,但我想自动执行此操作。
这就是我想使用它的方式:
function myFunc(a: number, b: number): number {
return a + b
}
let partFunc: PartialFunc<typeof myFunc>
// later
partFunc = (b) => myFunc(42, b)
Run Code Online (Sandbox Code Playgroud)
而且我不知道是否可以创建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>{}
Run Code Online (Sandbox Code Playgroud)
或与泛型类型相同:
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>
Run Code Online (Sandbox Code Playgroud)
但这仍然需要我指定所有类型:
let partFunc: PF<typeof myFunc, number, number, number>
Run Code Online (Sandbox Code Playgroud)
否则我有any类型。
虽然这会强制执行类型检查,例如它不会接受PF<typeof myFunc, number, number, string>,但我想避免再次编写类型。
基本上我想对 TS 说拿这个函数的签名并删除第一个参数
有什么解决办法吗?
此任务的上下文 - 我有一个react-redux应用程序,我想将参数从存储绑定到操作调度程序。
在 TypeScript 2.8 及更高版本中,您可以使用条件类型来执行此操作,方法是利用条件类型功能中的出色类型推断功能。在这种特殊情况下,您可以如何使用它:
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);
Run Code Online (Sandbox Code Playgroud)
请注意这仅适用于恰好两个必需参数的具体函数。如果您需要它处理更多/更少可能可选参数的可能通用函数,您将不得不更加努力地通过枚举案例和彻底测试来完成它。这是因为 TypeScript 当前(从 TypeScript 2.8 开始)缺乏以编程方式访问函数参数的方法。RemoveFirstParam<>您需要的确切类型取决于您的用例。
希望有帮助。祝你好运。
| 归档时间: |
|
| 查看次数: |
548 次 |
| 最近记录: |