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

