如何在同一接口中通过一个属性实现另一属性的类型推断?
实现同一类型中属性的动态类型依赖
你的需求是可行的,但直接用Record<string, any>的写法无法达到预期效果——因为keyof Record<string, any>的结果是string | number | symbol,这意味着propB可以是任意字符串,没法约束到propA的具体键。
要实现propB依赖propA键的类型推断,核心是用泛型来捕获propA的具体结构,让类型系统能关联两个属性的类型。
方案1:显式指定泛型参数
type MyType<T extends Record<string, any>> = { propA: T; propB: keyof T; }; // 显式声明propA的结构,propB会被约束为该结构的键 const example: MyType<{ name: string; age: number }> = { propA: { name: "Jay", age: 20 }, propB: "name" // 只能是"name"或"age",输入其他值会报错 };
方案2:用函数自动推断泛型(更便捷)
如果不想手动写泛型参数,可以借助函数让TypeScript自动推断propA的结构:
type MyType<T extends Record<string, any>> = { propA: T; propB: keyof T; }; function createMyType<T extends Record<string, any>>(obj: MyType<T>) { return obj; } // TypeScript会自动根据propA的结构推断出propB的合法取值 const example2 = createMyType({ propA: { name: "Jay", age: 20 }, propB: "age" // 合法;若写"gender"则会触发类型错误 });
泛型T会捕获propA的具体类型(比如{ name: string; age: number }),此时propB的类型被设置为keyof T,也就是该具体类型的所有键,从而实现了propB对propA键的依赖约束。
内容的提问来源于stack exchange,提问作者Muhammad Maher Elsherif
相关产品推荐
相关产品推荐

