TypeScript工厂/驱动模式下从兄弟属性推导配置类型
TypeScript驱动/工厂模式的配置类型自动推导方案
核心思路
让FactoryDefinition关联工厂的配置类型,借助TypeScript的条件类型和泛型推导,让配置对象的config字段自动匹配对应工厂的配置类型,彻底解决any类型导致的类型不安全问题。
调整后的通用接口
先重新定义基础的工厂和服务接口,明确泛型绑定关系:
// 通用服务接口 interface Service { doSomething(): void; } // 通用工厂接口,绑定对应的配置类型 interface Factory<C> { create(config: C): Service; } // 关联工厂与配置类型的定义,通过泛型约束和条件类型提取配置 type FactoryDefinition<T extends Record<string, Factory<any>>> = { [K in keyof T]: { driver: K; config: T[K] extends Factory<infer C> ? C : never; }; }[keyof T];
具体实现示例
以FooService和BarService为例,定义对应的配置、服务和工厂:
// Foo服务专属配置 interface FooServiceConfig { fooUrl: string; timeout: number; } class FooService implements Service { constructor(private config: FooServiceConfig) {} doSomething(): void { console.log(`Foo服务运行在 ${this.config.fooUrl}`); } } class FooFactory implements Factory<FooServiceConfig> { create(config: FooServiceConfig): Service { return new FooService(config); } } // Bar服务专属配置 interface BarServiceConfig { barApiKey: string; } class BarService implements Service { constructor(private config: BarServiceConfig) {} doSomething(): void { console.log(`Bar服务使用密钥 ${this.config.barApiKey}`); } } class BarFactory implements Factory<BarServiceConfig> { create(config: BarServiceConfig): Service { return new BarService(config); } }
配置数组的类型安全定义
先定义所有可用工厂的映射,再基于这个映射推导合法的配置类型:
// 锁定工厂映射的类型,让TypeScript能精确识别每个工厂的泛型参数 const factories = { foo: new FooFactory(), bar: new BarFactory() } as const; // 自动推导所有合法的配置类型 type ValidConfig = FactoryDefinition<typeof factories>; // 配置数组,每个项的config会自动匹配对应driver的工厂配置 const serviceConfigs: ValidConfig[] = [ { driver: 'foo', config: { fooUrl: 'https://foo.example.com', timeout: 5000 // 类型正确,缺项或类型错误会直接报错 } }, { driver: 'bar', config: { barApiKey: 'abc123' // 类型正确 } } ];
类型安全验证
如果尝试传入不符合要求的配置,TypeScript会立即报错:
// 错误示例:foo的config缺少fooUrl,触发类型检查报错 const invalidConfig: ValidConfig = { driver: 'foo', config: { timeout: 5000 } };
关键细节说明
- 使用
as const锁定factories的类型,确保TypeScript能精确提取每个工厂对应的配置泛型 FactoryDefinition通过条件类型T[K] extends Factory<infer C> ? C : never自动提取每个工厂的配置类型- 最终
ValidConfig是所有合法驱动配置的联合类型,保证driver和config严格匹配
内容的提问来源于stack exchange,提问作者christiaan
相关产品推荐
相关产品推荐

