利用keyof自动推导返回类型:RootState服务映射类型匹配问题
解决方案
要实现根据RootState的键自动推导对应Service类型的映射,你可以通过TypeScript映射类型+类型推断来完成,具体步骤如下:
1. 修正并明确基础类型定义
首先确保RootState是合法的TypeScript类型(补充缺失的关键字):
// 假设Car和User是已定义的业务类型 interface Car { /* ... */ } interface User { /* ... */ } interface ResourceState<ItemType> { rows: ItemType[]; store: Record<string, ItemType>; } interface RootState { car: ResourceState<Car>; user: ResourceState<User>; } type Service<Resource> = (id: string) => Promise<Resource>;
2. 定义映射类型StoreServicesMapping
通过keyof遍历RootState的所有键,结合infer推断每个ResourceState对应的泛型参数,自动生成对应Service类型:
type StoreServicesMapping<T extends Record<string, ResourceState<any>>> = { [K in keyof T]: T[K] extends ResourceState<infer Item> ? Service<Item> : never; // 若属性不是ResourceState类型,强制为never避免错误赋值 };
3. 使用映射类型定义服务映射
现在定义storeServicesMapping时,TypeScript会自动校验每个键对应的服务类型是否匹配,错误赋值会直接抛出类型错误:
// 示例业务服务函数 const fetchCar = (id: string): Promise<Car> => { /* 具体实现 */ }; const fetchUser = (id: string): Promise<User> => { /* 具体实现 */ }; // 合法赋值:每个键的服务类型完全匹配 const storeServicesMapping: StoreServicesMapping<RootState> = { car: fetchCar, user: fetchUser, }; // 错误示例:若给car赋值返回Promise<User>的函数,TypeScript会报错 // const invalidMapping: StoreServicesMapping<RootState> = { // car: fetchUser, // 类型不兼容:Promise<User>无法赋值给Promise<Car> // user: fetchUser, // };
原理说明
keyof T:获取RootState的所有键(car、user)T[K] extends ResourceState<infer Item>:对每个键对应的ResourceState类型,自动推断出其泛型参数Item(即Car或User)- 最终每个键的类型被约束为
Service<Item>,确保服务函数的返回值类型与对应资源类型严格一致
内容的提问来源于stack exchange,提问作者SoWhat
相关产品推荐
相关产品推荐

