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
相关产品推荐
相关产品推荐

