TypeScript中如何根据父级键为对象子元素指定类型
精准关联版本与选项类型的可扩展TypeScript配置方案
问题背景
需要创建如下结构的配置对象:
const config = { version1: { options: ["A", "B", "C"] }, version2: { options: ["B", "D", "E"] }, // 可扩展更多版本 }
已定义以下类型:
type VersionNames = "version1" | "version2"; type Version1Options = "A" | "B" | "C"; type Version2Options = "B" | "D" | "E";
当前使用的通用类型无法实现版本与对应选项类型的精准绑定:
type Configuration = { [k in VersionNames]: { options: Version1Options[] | Version2Options[] } }
options字段为联合类型,无法约束version1只能使用Version1Options、version2只能使用Version2Options,且希望方案支持扩展,避免逐个手动定义或条件判断(实际场景为深层嵌套对象)。
解决方案
核心是通过建立版本与对应类型的映射关系,利用TypeScript的映射类型自动生成精准关联的配置结构。
1. 定义版本-选项类型映射
先创建一个类型别名,明确每个版本对应的选项类型:
type VersionOptionMap = { version1: Version1Options; version2: Version2Options; // 新增版本时直接添加键值对即可,例如:version3: Version3Options; };
2. 生成精准的Configuration类型
基于VersionOptionMap,通过映射类型和索引访问类型自动生成每个版本的配置结构:
type Configuration = { [K in keyof VersionOptionMap]: { options: VersionOptionMap[K][]; }; };
效果验证
此时Configuration会实现精准的类型关联:
config.version1.options被推断为Version1Options[],仅允许"A"、"B"、"C"config.version2.options被推断为Version2Options[],仅允许"B"、"D"、"E"- 新增版本时,只需在
VersionOptionMap中添加新的映射关系,Configuration会自动更新,无需修改核心类型定义
深层嵌套场景适配
对于深层嵌套的对象结构,只需扩展版本类型映射即可。例如每个版本包含options和settings字段:
// 定义各版本的深层类型 type Version1Settings = { theme: "light" | "dark" }; type Version2Settings = { theme: "system" | "custom"; size: "sm" | "md" }; // 更新版本-类型映射 type VersionTypeMap = { version1: { options: Version1Options; settings: Version1Settings; }; version2: { options: Version2Options; settings: Version2Settings; }; }; // 生成深层嵌套的配置类型 type DeepConfiguration = { [K in keyof VersionTypeMap]: { [P in keyof VersionTypeMap[K]]: VersionTypeMap[K][P]; }; };
该方案同样支持深层嵌套结构的自动类型生成,扩展性完全不受影响。
内容的提问来源于stack exchange,提问作者James Black
相关产品推荐
相关产品推荐

