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

React+TypeScript项目中setRows赋值roles时出现TS错误求助

解决React+TypeScript中setRows的类型不匹配错误

你的TypeScript错误核心是**useSelector返回的roles类型与setRows期望的GetAllRolesResponse[]类型不兼容**,以下是具体排查和解决步骤:

1. 检查Selector的返回类型

先确认allRoles这个Redux selector的返回类型是否和GetAllRolesResponse[]完全一致:

  • 核对字段名是否一致(比如是否把permission写成了permissions)
  • 检查字段是否为必填类型(比如selector返回的createPermission可能是boolean | undefined,但你的接口定义是必填boolean)

2. 给useSelector显式指定类型

TypeScript有时无法正确推断selector的返回类型,手动指定类型约束可以避免这类问题:

// 先定义Redux根状态类型(如果项目中还没定义)
import { combineReducers } from 'redux';
const rootReducer = combineReducers({
  // 填入你的reducer配置
});
export type RootState = ReturnType<typeof rootReducer>;

// 给useSelector指定类型
const roles = useSelector<RootState, GetAllRolesResponse[]>(allRoles);

3. 类型适配(如果结构存在差异)

如果roles的结构和GetAllRolesResponse接近但不完全匹配,可通过以下方式适配:

简单场景:类型断言

useEffect(() => {
  setRows(roles as GetAllRolesResponse[]);
  setLoader(false);
}, []);

复杂场景:转换函数(更安全)

const transformRoles = (rawRoles: any): GetAllRolesResponse[] => {
  return rawRoles.map((role: any) => ({
    id: role.id,
    roleName: role.roleName,
    description: role.description,
    permission: role.permission?.map((p: any) => ({
      id: p.id,
      component: p.component,
      createPermission: !!p.createPermission, // 确保转为boolean类型
      viewPermission: !!p.viewPermission,
      updatePermission: !!p.updatePermission,
      deletePermission: !!p.deletePermission,
    })) || []
  }));
};

useEffect(() => {
  setRows(transformRoles(roles));
  setLoader(false);
}, []);

4. 确保INITIAL_DATA的类型正确

给INITIAL_DATA显式指定类型,避免TypeScript自动推断出错:

const INITIAL_DATA: GetAllRolesResponse[] = [
    {
        "id": 1,
        "roleName": "Client Admin",
        "description": "This is a client admin",
        "permission": [{
            "id": 1,
            "component": "Client",
            "createPermission": true,
            "viewPermission": true,
            "updatePermission": true,
            "deletePermission": true
        }]
    },
    {
        "id": 2,
        "roleName": "Annotator",
        "description": "This is Annotator",
        "permission": [{
            "id": 1,
            "component": "Client",
            "createPermission": true,
            "viewPermission": true,
            "updatePermission": true,
            "deletePermission": true
        }]
    },
];

内容的提问来源于stack exchange,提问作者Nikhil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 18:27:54