Node.js/TypeScript中如何实现私有变量的链式调用语法?
在TypeScript/Node.js中实现链式属性设置的简洁方案
需求场景
假设有如下类:
class MyClass { private a: number; private b: number; private c: number; private d: number; // ... 还有20个私有变量 }
希望实现链式调用的方式快速初始化部分属性:
const x = new MyClass().a(32).b(34).c(56);
目前已知的两种方案都存在弊端:
- 手动编写大量重复的setter方法,繁琐冗余;
- 批量设置属性的方式,不符合仅需覆写少量变量的使用场景。
解决方案
方法1:用TypeScript装饰器自动生成链式setter
自定义装饰器,为类的私有属性自动生成对应的链式setter方法,避免重复编码:
function ChainableProperty(target: any, propertyKey: string) { Object.defineProperty(target, propertyKey, { value: function(val: number) { this[propertyKey] = val; return this; }, writable: true, configurable: true }); } class MyClass { @ChainableProperty private a: number; @ChainableProperty private b: number; @ChainableProperty private c: number; // ... 其他属性添加该装饰器即可 } // 使用示例 const x = new MyClass().a(32).b(34).c(56);
方法2:利用Proxy动态拦截实现链式调用
通过Proxy代理类实例,动态生成属性对应的setter函数,无需修改类内部结构:
class MyClass { private a: number; private b: number; private c: number; // ... 其他私有属性 static create() { const instance = new MyClass(); return new Proxy(instance, { get(target, prop) { if (prop in target) { return Reflect.get(target, prop); } // 动态生成setter,设置对应属性并返回实例 return function(val: number) { target[prop as keyof MyClass] = val; return this; }; } }) as MyClass & Record<string, (val: number) => any>; } } // 使用示例 const x = MyClass.create().a(32).b(34).c(56);
方法3:简化Builder模式(类型安全优先)
将构建逻辑与业务类分离,保留完整的类型提示,适合对类型安全要求高的场景:
class MyClass { private a?: number; private b?: number; private c?: number; // ... 其他私有属性 private constructor() {} static builder() { return new MyClassBuilder(); } } class MyClassBuilder { private instance: MyClass; constructor() { this.instance = new MyClass(); } a(val: number): this { this.instance['a'] = val; return this; } b(val: number): this { this.instance['b'] = val; return this; } c(val: number): this { this.instance['c'] = val; return this; } // ... 其他属性的setter方法 build(): MyClass { return this.instance; } } // 使用示例 const x = MyClass.builder().a(32).b(34).c(56).build();
内容的提问来源于stack exchange,提问作者mleko
相关产品推荐
相关产品推荐

