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

TypeScript数组元素的条件类型配置问题

实现插件与对应Options的类型匹配数组

首先定义各插件的专属Options类型,以及枚举与类型的映射关系:

// 各插件的自定义Options类型
type PluginAOptions = {
  aSpecificProp: string;
  anotherAProp: number;
};

type PluginBOptions = {
  bUniqueProp: boolean;
  listB: string[];
};

// 插件枚举
enum Plugins {
  A = "A",
  B = "B",
  // 可按需扩展更多插件
}

// 建立枚举到对应Options类型的映射
type PluginOptionsMap = {
  [Plugins.A]: PluginAOptions;
  [Plugins.B]: PluginBOptions;
};

接着定义单个插件配置项的联合类型,确保plugin与options严格匹配:

// 生成所有合法的插件配置项联合类型
type PluginConfig = {
  [K in keyof PluginOptionsMap]: {
    plugin: K;
    options: PluginOptionsMap[K];
  };
}[keyof PluginOptionsMap];

最后将数组定义为该联合类型的集合,TypeScript会自动校验每个条目的类型合法性:

// 支持任意长度、任意顺序、重复插件的配置数组
const allOptions: PluginConfig[] = [
  {
    plugin: Plugins.A,
    options: {
      aSpecificProp: "test",
      anotherAProp: 123,
    },
  },
  {
    plugin: Plugins.B,
    options: {
      bUniqueProp: true,
      listB: ["foo", "bar"],
    },
  },
  {
    plugin: Plugins.A, // 允许重复添加同一插件
    options: {
      aSpecificProp: "another",
      anotherAProp: 456,
    },
  },
];

方案说明

  • PluginOptionsMap明确了枚举值与对应Options类型的关联,保证类型映射准确。
  • PluginConfig通过映射类型生成所有合法的插件配置项组合,强制每个条目里plugin和options的类型匹配。
  • 数组类型PluginConfig[]完全满足需求:支持任意长度、任意顺序,也允许同一插件的多个条目。

如果配置错误(比如给Plugin A搭配Plugin B的Options),TypeScript会直接抛出类型错误:

// 错误示例:类型不匹配会被即时校验出来
const badConfig: PluginConfig[] = [
  {
    plugin: Plugins.A,
    options: {
      bUniqueProp: false, // 此处报错:不符合PluginAOptions的类型定义
    },
  },
];

内容的提问来源于stack exchange,提问作者benjamin.keen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 01:45:34