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

如何修复Redux Toolkit中'Property X does not exist on PayloadAction'报错

问题根源

你在authenticate.fulfilled的回调里直接从action对象上取idToken、localId是错误的:Redux Toolkit 异步thunk返回的所有数据都会挂载到action的payload属性下,你要拿返回值必须从action.payload里取,所以TS才会提示action上不存在idToken属性。

修正方案

1. 核心修改点

调整extraReducers里的取值逻辑,把直接从action取字段改为从action.payload里获取对应字段即可,同时可以给createAsyncThunk加上显式的泛型声明,进一步规范类型,避免后续的类型报错。

修正后的完整代码

import axios from 'axios'
import { createAsyncThunk, createSlice } from '@reduxjs/toolkit';

interface ReqPayload {
  email: string,
  password: string,
  returnSecureToken: boolean
}

// 抽离thunk返回值的类型,方便复用
interface AuthResponse {
  idToken: string,
  email: string,
  refreshToken: string,
  expiresIn: string,
  localId: string,
  registered: boolean
}

interface ResPayload {
  data: AuthResponse
}

// 给createAsyncThunk加泛型:第一个参数是返回值类型,第二个是入参类型
export const authenticate = createAsyncThunk<AuthResponse, ReqPayload>(
  'auth',
  async ({ email, password, returnSecureToken }) => {
    const API_KEY = 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
    const payload: ReqPayload = { email, password, returnSecureToken: true }
    const response: ResPayload = await axios.post(
      `https://identitytoolkit.googleapis.com/v1/accounts:${returnSecureToken ? 'signInWithPassword' : 'signUp'}?key=${API_KEY}`,
      payload
    )
    const { localId, idToken, expiresIn } = response.data
    const expirationDate = new Date(new Date().getTime() + (+expiresIn * 1000))
    localStorage.setItem('idToken', idToken)
    localStorage.setItem('localId', localId)
    localStorage.setItem('expirationDate', '' + expirationDate)

    return response.data
  }
);
interface AuthState {
  idToken: string | null,
  localId: string | null,
  error: object | null,
  isLoading: boolean,
}

const initialState: AuthState = {
  idToken: null,
  localId: null,
  error: null,
  isLoading: false,
}

export const authSlice = createSlice({
  name: 'auth',
  initialState,
  reducers: {
  },
  extraReducers: (builder) => {
    builder
      .addCase(authenticate.fulfilled, (state, action) => {
        // 从payload里取对应字段
        state.idToken = action.payload.idToken
        state.localId = action.payload.localId
        state.error = null
        state.isLoading = false
      })
  },
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 20:24:03