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

TypeScript如何为支持链式调用的重载get/set函数声明类型

解决方案

使用TypeScript的函数重载特性即可实现根据入参匹配对应返回类型的效果,完全满足你区分getter、setter场景的需求。

首先为实例类型定义对应的重载签名:

// 先定义你的实例的类型,这里假设实例类型为Thing
interface Thing {
  // 示例中的其他链式方法
  otherMethod(): this;
  // 重载1:无入参时作为getter,返回数字类型
  doSomething(): number;
  // 重载2:传入number数组时作为setter,返回实例本身支持链式调用
  doSomething(arg: number[]): this;
}

原有逻辑不需要修改,仅需要对应上类型定义即可:

let something: number[] = [];
const thing: Thing = {} as Thing;

thing.doSomething = function(arg?: number[]) {
  // *注:你原有代码中判断`arguments`的逻辑存在问题,arguments对象永远为真值,运行时会永远走setter分支,建议修改为`arguments.length`判断是否传入参数
  return arguments ? 
    ((something = arg), thing) : something.length;
}

实际调用时TypeScript会自动匹配对应的重载,不会将返回值合并为联合类型:

// 传入参数时,返回值类型推导为Thing,链式调用正常无报错
thing.doSomething([1,2,3]).otherMethod();

// 不传入参数时,返回值类型推导为number
const length = thing.doSomething();

内容的提问来源于stack exchange,提问作者gdanov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 05:24:01