TypeScript中对象方法绑定函数的类型定义问题排查
问题
我正在给自己的趣味库实现一个函数,它接收包含方法的输入对象,将其转换为输出对象——输出对象的方法会调用输入对象的对应方法,并把自身作为第一个参数传入。举个例子:
输入对象:
{ f(thing, x, y) { ... } /* g()... */ }
转换后的输出对象:
thing = { f(x, y) { return (输入对象).f(thing, x, y); } }
我使用TypeScript 5.0.1-rc(借助const泛型)编写了如下类型定义:
export type Thing<T extends Record<string, (thing: Thing<T>, ...args: any[]) => unknown>> = { [K in keyof T]: T[K] extends (thing: Thing<T>, ...args: infer Args) => infer Return ? (...args: Args) => Return : never }; declare function thingdoer<const T extends Record<string, (thing: Thing<T>, ...args: any[]) => unknown>>(input: T): Thing<T>;
遇到的问题
- 当调用无参数的方法时,类型表现正常,比如:
thingdoer({ f() { ... } }).f(); - 但当方法接收
thing参数时:thingdoer({ f(thing) { ... } }).f();f()的签名变成了(...args: any[]) => unknown,不符合预期。
尝试过的调整
把泛型约束改为object后能部分生效,但thing参数的类型会变成any,不知道该怎么处理。另外怀疑这是否和TypeScript的某个已知类型推导问题有关。
内容的提问来源于stack exchange,提问作者i cant
相关产品推荐
相关产品推荐

