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

