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

如何让对象中某属性的类型依赖于同对象另一属性的类型?

解决方案

问题出在你定义的TConfig里,func和param的类型被固定为TParam(any),导致每个配置项的这两个字段类型无法关联。要让param获得对应func参数的类型提示,需要用泛型让每个配置项的func和param绑定同一类型:

修改后的代码

// 定义泛型类型,让每个配置项的func和param共享同一类型P
type TConfigItem<P> = {
  func: (param: P) => P;
  param: P;
};

// 让handleConfig接受泛型参数,约束输入为键值对,每个值都是TConfigItem<P>
function handleConfig<T extends Record<string, TConfigItem<any>>>(config: T) {}

type TMyParam1 = {
  prop1: string;
  prop2: number;
};

type TMyParam2 = {
  prop3: boolean;
  prop4: string;
};

handleConfig({
  '1': {
    func: (param: TMyParam1) => param,
    param: {
      // 现在会自动提示prop1、prop2字段
      prop1: "test",
      prop2: 123
    }
  },
  '2': {
    func: (param: TMyParam2) => param,
    param: {
      // 现在会自动提示prop3、prop4字段
      prop3: true,
      prop4: "hello"
    }
  }
});

原理说明

  • TConfigItem<P>泛型类型强制每个配置项的func参数类型和param类型必须一致,避免类型脱节。
  • handleConfig使用泛型T约束输入结构,TypeScript会自动推导每个配置项中P的具体类型,从而给param提供准确的字段补全提示。

另一种等价写法:

type TConfig<T extends Record<string, any>> = {
  [K in keyof T]: {
    func: (param: T[K]) => T[K];
    param: T[K];
  };
};

function handleConfig<T extends Record<string, any>>(config: TConfig<T>) {}

通过索引签名结合泛型,同样能让TypeScript自动推导每个键对应的参数类型,实现代码提示效果。

内容的提问来源于stack exchange,提问作者Кирилл Панихин

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 02:00:11