如何确保attachInstanceToLb仅使用已调用createLoadBalancer的负载均衡器名称?
确保
attachInstanceToLb仅接收已创建的负载均衡器名称的TypeScript方案 方案1:链式API设计(最直观的用户体验)
这种方式让createLoadBalancer返回绑定当前LB名称的对象,直接通过该对象调用绑定实例的方法,从根源上避免跨LB调用的问题。
function createLoadBalancer<T extends string>(name: T) { // 实现创建负载均衡器的逻辑 console.log(`Created load balancer: ${name}`); return { // 绑定实例的方法仅能作用于当前创建的LB attachInstance: () => { console.log(`Attached instance to load balancer: ${name}`); // 绑定逻辑实现 } }; } // 合法调用:先创建LB,再通过返回对象绑定实例 const myLB = createLoadBalancer('first'); myLB.attachInstance(); // 无法直接调用独立的attachInstanceToLb传入未创建的名称 // 如下代码不存在(除非先创建对应LB) // attachInstanceToLb('second');
优点:API设计直观,用户不可能误用;无需复杂类型技巧,可读性高。
方案2:利用TypeScript类型系统跟踪已创建的LB名称
通过可变类型和类型断言,在编译时强制attachInstanceToLb仅接受已创建的LB名称。
// 初始类型:无已创建的LB type CreatedLoadBalancerNames = never; // 定义跟踪已创建LB的上下文类型 declare global { interface LoadBalancerContext { createdLBs: CreatedLoadBalancerNames; } } // 模块级上下文实例 const lbContext: LoadBalancerContext = { createdLBs: undefined as never }; // createLoadBalancer更新上下文类型,标记名称已创建 function createLoadBalancer<T extends string>(name: T): asserts typeof lbContext is { createdLBs: CreatedLoadBalancerNames | T } { // 实际创建LB逻辑 console.log(`Created load balancer: ${name}`); // 运行时记录(可选) (lbContext.createdLBs as string[]).push(name); } // attachInstanceToLb仅接受已创建的LB名称 function attachInstanceToLb(lbName: typeof lbContext.createdLBs) { console.log(`Attached instance to load balancer: ${lbName}`); // 绑定逻辑实现 } // 合法调用 createLoadBalancer('first'); attachInstanceToLb('first'); // 编译通过 // 非法调用:TypeScript报错,'second'不在已创建列表中 attachInstanceToLb('second');
优点:保留独立函数调用方式;编译时严格检查。
缺点:依赖全局/模块级类型,类型跟踪逻辑相对复杂。
方案3:类封装(兼顾编译时检查与运行时状态)
通过类封装LB的创建和绑定逻辑,类的类型自动跟踪已创建的LB名称,同时运行时维护状态。
class LoadBalancerManager { // 运行时存储已创建的LB名称 private createdLoadBalancers: string[] = []; // 创建LB,返回名称并更新类型 createLoadBalancer<T extends string>(name: T): T { this.createdLoadBalancers.push(name); console.log(`Created load balancer: ${name}`); return name; } // 仅接受已创建的LB名称(类型由createdLoadBalancers推断) attachInstanceToLb(lbName: this['createdLoadBalancers'][number]) { console.log(`Attached instance to load balancer: ${lbName}`); // 绑定逻辑实现 } } // 使用示例 const manager = new LoadBalancerManager(); const firstLB = manager.createLoadBalancer('first'); // 合法调用 manager.attachInstanceToLb(firstLB); manager.attachInstanceToLb('first'); // 也可直接传入字符串字面量 // 非法调用:TypeScript报错,'second'未被创建 manager.attachInstanceToLb('second');
优点:同时支持编译时类型检查和运行时状态验证;代码结构清晰,适合复杂场景。
缺点:需通过类实例调用方法,相比全局函数稍显繁琐。
内容的提问来源于stack exchange,提问作者Bruno Pêrel
相关产品推荐
相关产品推荐

