如何在TypeScript中基于模型路径匹配value的对应类型?
TypeScript 关联对象路径key与对应value类型
要实现key和value的类型关联,你需要把ObjType定义为联合类型,让每个联合成员中的key和对应的value类型绑定,而不是分开的独立联合。具体步骤如下:
1. 实现FieldPath生成所有合法路径
首先需要一个类型来提取对象的所有点分隔路径字符串:
type FieldPath<T> = T extends object ? { [K in keyof T]: K extends string ? T[K] extends object ? `${K}.${FieldPath<T[K]>}` | K : K : never; }[keyof T] : never;
这个类型会递归遍历对象的所有层级,生成类似"a"、"a.b"、"a.b.c"、"d"、"d.e"的路径联合。
2. 定义关联类型ObjType
利用FieldPath和已有的PathValue,定义ObjType为每个路径对应的键值对联合:
type ObjType = { [P in FieldPath<A>]: { key: P; value: PathValue<A, P>; }; }[FieldPath<A>];
这里通过映射类型遍历所有路径P,为每个路径生成一个{ key: P; value: PathValue<A, P> }的类型,最后通过索引访问把映射类型转为联合类型。这样每个联合成员的key和value类型是严格绑定的。
3. 验证示例代码
现在你的示例代码会得到正确的类型检查:
const resultObj1: ObjType = { key: "d.e", value: "2"; // 必须匹配MySecondResultType,输入其他值会报错 }; const resultObj2: ObjType = { key: "a.b.c", value: "1"; // 必须匹配MyFirstResultType,输入其他值会报错 };
如果只需要特定路径(比如仅"d.e"和"a.b.c"),可以把FieldPath<A>替换为指定的路径联合:
type TargetPaths = "d.e" | "a.b.c"; type ObjType = { [P in TargetPaths]: { key: P; value: PathValue<A, P>; }; }[TargetPaths];
内容的提问来源于stack exchange,提问作者Egor Pashko
相关产品推荐
相关产品推荐

