You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

利用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 22:24:32