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

Ngrx参数类型错误:分发StoreUser动作时出现类型不匹配问题

问题描述

我有一个用户注册服务,代码如下:

public signup = (user:UserModel) => {
    console.log('UserService.user', user)

    return this.httpClient.post<{user:UserModel}>(this.url, {user}).pipe(
      tap(user => {
        console.log('UserService.user tap', user)
        this.store.dispatch(StoreUser({user}))
      })
   )
 }

尝试将后端返回的用户信息分发至StoreUser动作时出现类型错误,错误提示如下:

类型“{ user: UserModel; }”缺少类型“UserModel”中的以下属性:firstName、lastName、password、email、token(2739)
user.actions.ts(6, 13): 预期类型来自属性“user”,该属性在类型“{ user: UserModel; }”上声明
(property) user: UserModel

相关依赖代码:

UserModel类

export class UserModel {
    public firstName:string = '';
    public lastName:string = '';
    public password:string = '';
    public email:string = '';
    public token:string = '';
}

StoreUser动作

import { createAction, props } from "@ngrx/store";
import { UserModel } from "./user.model";

export const StoreUser = createAction(
    '[Store user] Store user',
    props<{ user:UserModel }>()
  );
错误原因

tap操作符里的user是HTTP响应的完整对象,类型为{user: UserModel},并非UserModel本身。直接将该对象传入StoreUser时,相当于给动作要求的UserModel类型参数传了一个嵌套对象,导致类型不匹配触发错误。

解决方法

从响应对象中提取出真正的UserModel类型值,再传入StoreUser即可:

public signup = (user:UserModel) => {
    console.log('UserService.user', user)

    return this.httpClient.post<{user:UserModel}>(this.url, {user}).pipe(
      tap(response => {
        console.log('UserService.user tap', response.user)
        this.store.dispatch(StoreUser({user: response.user}))
      })
   )
 }

如果不想修改变量名,也可以直接通过嵌套属性访问:

this.store.dispatch(StoreUser({user: user.user}))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 05:33:15