TypeScript:如何为对象键值对分配正确的返回值类型?
TypeScript:将函数对象转换为返回值类型对象
问题说明
现有如下定义的对象:
export const typedGetters = { [GettersE.login]: (state: RootState) => state.loggedIn, };
需要创建一个键名与原对象完全一致,但值类型为对应函数返回值类型的对象。举个直观例子:
原对象类型:
{ test: () => "test"; foo: () => DataType as DataT; }
期望得到的目标类型:
{ test: string; foo: DataT; }
尝试了以下写法,但每个键的类型变成了所有返回值的联合类型(比如示例中login本应是boolean,却变成了联合类型):
let getters = store.getters as { [key in keyof typeof typedGetters]: ReturnType< (typeof typedGetters)[keyof typeof typedGetters] >; };
修正方案
将类型定义中的函数类型定位改为针对当前key的具体函数,而不是所有函数的联合类型:
let getters = store.getters as { [key in keyof typeof typedGetters]: ReturnType<(typeof typedGetters)[key]>; };
原理说明
原来的写法中,(typeof typedGetters)[keyof typeof typedGetters]会取到typedGetters中所有函数类型的联合,ReturnType作用于这个联合类型时,得到的就是所有返回值类型的联合。
而修正后的写法,对每个遍历到的key,单独取该key对应的函数类型(typeof typedGetters)[key],再通过ReturnType获取这个具体函数的返回值类型,这样每个键就能得到对应的精准类型。
以你的typedGetters为例,getters[GettersE.login]的类型会正确推导为boolean,符合预期。
内容的提问来源于stack exchange,提问作者Ilijanovic
相关产品推荐
相关产品推荐

