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

TypeScript中能否通过对象属性关联另一属性的类型?

TypeScript中根据model字段约束对应data类型的实现方案

你想要的那种as K直接在接口里绑定关联类型的写法确实没法直接实现,但可以通过联合类型+映射类型的组合达到完全一样的效果,让TypeScript根据每个fixture的model值自动约束data的类型。

具体实现步骤

首先保留你定义的Models接口:

interface Models {
  Table1: { t1Prop: string }
  Table2: { t2Prop: number }
  // 可继续添加更多表结构
}

接下来生成包含所有合法fixture类型的联合类型:

type Fixture = { [K in keyof Models]: {
  model: K;
  data: Models[K];
} }[keyof Models];

这个类型的逻辑是:遍历Models的每个键K,生成对应model为K、data为Models[K]的对象类型,最后把所有这些对象类型合并成一个联合类型。

最后把fixtures的类型指定为这个联合类型的数组:

const fixtures: Fixture[] = [
  {
    model: 'Table1',
    data: { t1Prop: 'hello' } // 类型正确,通过校验
  }, 
  {
    model: 'Table2',
    data: { t2Prop: 1 } // 类型正确,通过校验
  }
];

错误校验示例

如果写错data的结构,TypeScript会直接报错:

// 错误示例:model是Table1,但data用了Table2的结构
const badFixtures: Fixture[] = [
  {
    model: 'Table1',
    data: { t2Prop: 1 } // TypeScript提示:类型"{ t2Prop: number; }"中缺少属性"t1Prop",但类型"Models["Table1"]"需要该属性
  }
];

总结

这种写法完美实现了你想要的效果:每个fixture的model和data类型强绑定,TypeScript会自动根据model的值校验data的结构,不需要依赖伪代码里的语法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 20:56:00