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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 01:27:47