基于映射类型实现方法转Props?泛型无参方法选择的类型推导问询
实现泛型
select函数:提取方法执行结果并保留类型 当然可以实现这个需求!咱们先梳理清楚核心诉求:
- 约束输入的
keys只能是原对象中无参方法的键 - 返回的对象类型要准确对应每个方法执行后的返回值类型
第一步:定义筛选无参方法键的类型
首先我们需要一个工具类型,用来从对象类型T中筛选出那些值是无参函数的键:
type MethodKeys<T> = { [P in keyof T]: T[P] extends () => any ? P : never; }[keyof T];
这个类型的逻辑是:遍历T的所有键,判断对应的值是否是无参函数,如果是就保留键名,否则返回never;最后通过[keyof T]提取所有有效键的联合类型。
第二步:实现带类型约束的select函数
接下来我们就可以写出符合要求的select函数了,利用TypeScript的ReturnType工具类型来提取每个方法的返回值类型:
function select<T, K extends MethodKeys<T>>(obj: T, keys: K[]): { [P in K]: ReturnType<T[P]> } { const result = {} as { [P in K]: ReturnType<T[P]> }; keys.forEach(key => { result[key] = obj[key](); }); return result; }
这里的关键点:
- 泛型
K被约束为MethodKeys<T>,确保传入的keys只能是原对象中的无参方法键 - 返回类型
{ [P in K]: ReturnType<T[P]> }精确对应每个方法执行后的返回值类型 - 函数内部通过类型断言
as { [P in K]: ReturnType<T[P]> }告诉TypeScript我们构造的结果符合预期类型
第三步:测试示例
我们来写个测试代码验证一下效果:
// 定义一个包含不同无参方法的对象 const demoObj = { getUserName: () => "Alice", getUserAge: () => 25, getIsActive: () => true, // 非无参方法会被自动排除在可选keys之外 getFullName: (firstName: string) => `${firstName} Smith` }; // 选择指定方法,返回的对象类型会自动推导为 { getUserName: string; getUserAge: number } const selected = select(demoObj, ["getUserName", "getUserAge"]); console.log(selected.getUserName); // "Alice" console.log(selected.getUserAge); // 25 // 如果尝试传入非无参方法的键(比如"getFullName"),TypeScript会直接报错
这样就完美实现了你想要的效果:不仅能正确执行方法并收集结果,还能在编译阶段保证类型安全,返回的对象类型完全符合预期。
内容的提问来源于stack exchange,提问作者frelars
相关产品推荐
相关产品推荐

