You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 18:50:21