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

TypeScript中能否实现嵌套对象属性的相互依赖?

实现嵌套对象属性的类型依赖

当然可以实现这种嵌套对象内属性的类型关联,核心是利用TypeScript的泛型和参数类型提取工具Parameters(或自定义类型提取逻辑),绑定函数与其参数的类型。

方案1:通用子对象泛型类型

先定义泛型的子对象类型,让args自动关联同一子对象中f的参数类型,args1关联f1:

// 提取函数的参数类型(也可直接用内置的Parameters<T>)
type ArgsType<Func> = Func extends (...args: infer Args) => any ? Args : never;

// 定义子对象类型,支持f/args、f1/args1的类型绑定
type SubObject<F extends (...args: any[]) => any, F1 extends (...args: any[]) => any = never> = {
  f: F;
  args: ArgsType<F>;
  // 可选的f1/args1:仅当f1存在时,args1才会有对应类型
  f1?: F1;
  args1?: F1 extends never ? never : ArgsType<F1>;
};

// 主对象类型:任意字符串键对应任意泛型参数的SubObject
type Obj = Record<string, SubObject<any, any>>;

使用示例

定义对象时,TypeScript会自动推断args和args1的类型:

const demo: Obj = {
  key1: {
    f: (props: { name: string; age: number }) => {},
    args: [{ name: "Alice", age: 30 }] // 类型自动匹配为 {name: string, age: number}[]
  },
  key2: {
    f: (props: { somethingRandom: number[] }) => {},
    args: [{ somethingRandom: [1, 2, 3] }],
    f1: (num: number, str: string) => {},
    args1: [123, "test"] // 类型自动匹配为 [number, string]
  }
};

方案2:泛型主对象(更严谨的类型约束)

如果需要更严格的类型校验,可以让主对象本身是泛型,TypeScript会完全推断每个键的类型:

type ArgsType<Func> = Func extends (...args: infer Args) => any ? Args : never;

// 泛型主对象类型,约束每个子对象的f和args、f1和args1类型关联
type Obj<ObjShape extends Record<string, { f: (...args: any[]) => any }>> = {
  [Key in keyof ObjShape]: {
    f: ObjShape[Key]['f'];
    args: ArgsType<ObjShape[Key]['f']>;
    f1?: (...args: any[]) => any;
    args1?: ArgsType<ObjShape[Key]['f1']>;
  };
};

// 使用时自动推断类型,无需手动指定泛型参数
const demo = {} as Obj<{
  key1: { f: (props: { name: string; age: number }) => void };
  key2: { f: (props: { somethingRandom: number[] }) => void; f1: (num: number, str: string) => void };
}>;

// 类型校验生效,错误参数会触发提示
demo.key1.args = [{ name: "Bob", age: 25 }]; // ✅ 正确
demo.key2.args1 = [456, "hello"]; // ✅ 正确
demo.key1.args = [{ name: "Bob" }]; // ❌ 类型错误,缺少age属性

关键知识点

  • Parameters<T>:TypeScript内置工具类型,提取函数类型T的参数类型数组。
  • infer关键字:在条件类型中提取类型片段,用于自定义参数类型提取逻辑。
  • 泛型约束:通过泛型绑定子对象内的函数和参数类型,实现类型依赖关系。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 20:42:11