TypeScript对象参数函数重载:如何根据asObject属性推断返回类型?
如何根据对象参数的属性值推断TypeScript函数返回类型
我来帮你搞定这个类型推断问题!你现在的函数重载没法精准区分asObject为true或false时的返回类型,因为Options里的asObject是宽泛的boolean类型,TypeScript没法识别调用时传入的具体字面量值。要实现需求,咱们得用泛型捕获属性的具体类型+条件类型动态返回结果,直接看修改后的代码:
interface MyMap<T> { [id: string]: T; } // 定义泛型Options,让asObject的类型是具体的布尔字面量(true/false) type Options<AsObject extends boolean = false> = { asObject: AsObject; other?: Function; }; // 用泛型约束+条件类型指定返回值 function get<AsObject extends boolean = false>( options: Options<AsObject> = { asObject: false, other: () => {} } as Options<AsObject> ): AsObject extends true ? MyMap<any> : any[] { if (options.asObject) { return {} as MyMap<any>; } return [] as any[]; } // 测试类型推断效果: const resultTrue = get({ asObject: true }); // 类型自动推断为MyMap<any> const resultFalse = get({ asObject: false }); // 类型自动推断为any[] const resultDefault = get(); // 默认返回any[]
关键逻辑说明:
- 泛型捕获具体类型:通过
<AsObject extends boolean>,我们让TypeScript捕获调用时传入的asObject的字面量值(而不是宽泛的boolean类型),比如传入true就捕获AsObject = true,传入false就捕获AsObject = false。 - 条件类型动态返回:用
AsObject extends true ? MyMap<any> : any[]这个条件类型,根据捕获到的AsObject值,动态指定函数的返回类型。 - 默认值类型对齐:默认参数的
asObject是false,所以给泛型设置默认值= false,同时用类型断言as Options<AsObject>让默认参数的类型和泛型对齐,避免类型报错。
如果你不想预先定义泛型的Options类型,也可以直接在函数参数里动态捕获对象类型,写法更简洁:
interface MyMap<T> { [id: string]: T; } function get<O extends { asObject: boolean }>( options: O = { asObject: false, other: () => {} } as O ): O["asObject"] extends true ? MyMap<any> : any[] { if (options.asObject) { return {} as MyMap<any>; } return [] as any[]; }
这种写法直接通过泛型O捕获传入的整个对象类型,再通过O["asObject"]获取asObject属性的具体类型,同样能实现精准的类型推断。
内容的提问来源于stack exchange,提问作者undefined
相关产品推荐
相关产品推荐

