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

