TypeScript中如何推断属性函数返回类型并复用为其他属性/参数类型?
解答你的TypeScript类型推断问题
这两个问题问得很到位!在TypeScript里完全能实现自动推断,不用每次手动指定泛型参数,我来给你拆解一下具体的解决方案:
问题1:自动推断属性函数的返回类型 & 问题2:复用该类型作为另一个函数的参数类型
其实这两个需求可以一起解决——核心是让TypeScript自动关联data函数的返回类型和run函数的参数类型。直接定义对象时TS做不到这点,但借助一个泛型辅助函数就能轻松实现:
第一步:定义泛型辅助函数
先写一个简单的工具函数,它会帮TS自动推断类型关系:
// 保留你原来的MaybePromise类型 type MaybePromise<T> = T | Promise<T>; // 泛型函数,TData会自动从传入的data函数返回值推断出来 function createRequest<TData>(config: { data: () => TData; run: (data: TData) => MaybePromise<unknown>; }) { return config; }
第二步:用辅助函数创建对象
现在用这个函数来定义你的request,TS会自动完成所有类型推断:
const request = createRequest({ data: () => ({ people: ["bob", "jack"] }), // 这里的data参数会自动被推断为 { people: string[] } run: (data) => Promise.resolve(data.people), });
此时你完全不用手动写IRequest<{ people: string[] }>,TS已经帮你把data的返回类型和run的参数类型关联起来了!
为什么这个方法能行?
当你把对象字面量传给createRequest时,TypeScript会:
- 先分析
data函数的返回值,自动推断出泛型TData的类型是{ people: string[] } - 接着把
run函数的data参数类型自动设置为TData,完美实现了两个属性之间的类型绑定
额外技巧:单独获取属性函数的返回类型
如果你需要在其他地方复用data函数的返回类型,可以用TS内置的ReturnType工具类型:
// 获取request.data的返回类型 type RequestData = ReturnType<typeof request.data>; // 可以直接把这个类型用作其他函数的参数 function processPeopleList(data: RequestData) { console.log(data.people.join(", ")); // 类型完全安全,不会出现属性不存在的报错 }
这样就彻底解决了你提出的两个问题,既不用手动指定类型,又保证了代码的类型安全性~
内容的提问来源于stack exchange,提问作者ljbc1994
相关产品推荐
相关产品推荐

