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

如何在同一接口中通过一个属性实现另一属性的类型推断?

实现同一类型中属性的动态类型依赖

你的需求是可行的,但直接用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 06:04:54