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

Type 'unknown'无法分配给WritableDraft<{}>|WritableDraft<User>报错解决

报错原因

你遇到的类型错误核心原因是用createAsyncThunk创建异步方法时没有指定返回值的TS类型,导致TS默认推断异步成功后的payload为unknown类型,无法直接赋值给已经声明了User | {}类型的state.user字段。

修复步骤

1. 给异步Thunk添加泛型声明

在auth.actions.ts文件中,给每一个用createAsyncThunk创建的异步方法指定返回值类型、入参类型:

import { createAsyncThunk } from '@reduxjs/toolkit';
import { User, LoginData, CreateAccountData } from '../../../model/users-model';

// 加载当前用户:返回User类型,无入参
export const loadCurrentUser = createAsyncThunk<User, void>(
  'auth/loadCurrentUser',
  async (_, { rejectWithValue }) => {
    try {
      // 原有请求逻辑,确保返回值符合User类型定义
      const res = await fetch('/api/user/current');
      return res.json() as User;
    } catch (err) {
      return rejectWithValue('加载用户信息失败');
    }
  }
);

// 登录:返回User类型,入参为LoginData类型
export const login = createAsyncThunk<User, LoginData>(
  'auth/login',
  async (loginData, { rejectWithValue }) => {
    try {
      // 原有登录请求逻辑
      const res = await fetch('/api/login', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify(loginData)
      });
      return res.json() as User;
    } catch (err) {
      return rejectWithValue('账号或密码错误');
    }
  }
);

// 注册账号:返回User类型,入参为CreateAccountData类型
export const CreateAccount = createAsyncThunk<User, CreateAccountData>(
  'auth/createAccount',
  async (accountData, { rejectWithValue }) => {
    // 原有注册请求逻辑
  }
);

// 登出:无返回值,无入参
export const logout = createAsyncThunk<void, void>(
  'auth/logout',
  async (_, { rejectWithValue }) => {
    // 原有登出请求逻辑
  }
);

2. (可选优化)调整AuthState的user字段类型

原有定义user: {} | User的兼容性较差,推荐调整为Partial<User>,既兼容初始值为空对象的写法,也符合字段的实际使用逻辑:

// users-model.ts中修改AuthState定义
export interface AuthState {
    status: Status;
    isAuthenticated: boolean;
    error: string;
    user: Partial<User>; // 替换原有 {} | User 定义
}

(应急临时方案)手动断言payload类型

如果暂时不想修改thunk的定义,可以在extraReducers中给payload手动加类型断言,不推荐长期使用:

builder.addCase(loadCurrentUser.fulfilled, (state, { payload }) => {
    state.isAuthenticated = true;
    state.status = 'resolved';
    state.user = payload as User; // 手动指定payload类型
});

完成以上修改后,unknown类型不匹配的报错就会消失。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 12:45:04