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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 13:10:23