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
相关产品推荐
相关产品推荐

