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

TypeScript 如何根据对象某字段key动态限定另一字段value类型

类型定义实现方案

你可以通过映射类型+索引联合查询的方式实现需求,不需要硬编码枚举age/city字段,后续filters新增字段时目标类型会自动同步更新,无需手动维护:

const filters = {
  age: { value: 25, isActive: true },
  city: { value: "tokyo", isActive: false },
};

// 提取原filters的结构类型
type FiltersType = typeof filters;

// 符合需求的目标类型
type DesiredShape = {
  [K in keyof FiltersType]: {
    filter: K;
    value: FiltersType[K]['value']
  }
}[keyof FiltersType];

// 合法示例
const obj1: DesiredShape = {filter: "city", value: "Vienna"}
const obj2: DesiredShape = {filter: "age", value: 30}

// 错误示例(会触发TS类型校验报错)
const invalidObj: DesiredShape = {filter: "age", value: "30"}

实现逻辑

  • 用[K in keyof FiltersType]遍历原类型所有键,把每个键映射为filter字段为当前键、value字段为对应值类型的对象结构
  • 末尾通过[keyof FiltersType]做索引查询,把所有映射生成的对象类型合并为联合类型,TypeScript会自动关联filter和value的类型约束,保证二者对应关系正确。

如果你的filters结构是提前通过接口定义的,直接替换FiltersType为对应接口名即可:

interface Filters {
  age: { value: number, isActive: boolean },
  city: { value: string, isActive: boolean },
}

type DesiredShape = {
  [K in keyof Filters]: {
    filter: K;
    value: Filters[K]['value']
  }
}[keyof Filters];

内容的提问来源于stack exchange,提问作者Erfan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 00:24:07