在Typescript Reac + Redux中具有联合类型的类型错误时属性不存在

费利佩

我是React和Redux的新手,并且正在使用Typescript进行一个小项目。我创建了第一个reducer和action,但是有一个问题:每当尝试访问有效内容时,都会得到一个Type error: property X does not exist in type

动作:

import { Action } from 'redux';
export const LOGIN_ACTION = 'login';
export const LOGIN_SUCCESS_ACTION = 'login-sucesss';
export const LOGIN_FAILED_ACTION = 'login-failed';

export interface LoginAction extends Action {
  type: string;
  payload: {
    username: string;
    password: string;
  };
}

export function login(username: string, password: string): LoginAction {
  return {
    type: LOGIN_ACTION,
    payload: { username, password },
  };
}

export interface LoginSuccessAction extends Action {
  type: string;
  payload: {
    loginToken: string;
  };
}

export function loginSuccess(loginToken: string): LoginSuccessAction {
  return {
    type: LOGIN_SUCCESS_ACTION,
    payload: { loginToken },
  };
}

export interface LoginFailedAction extends Action {
  type: string;
  payload: {
    error: Error;
  };
}

export function loginFailed(error: Error): LoginFailedAction {
  return {
    type: LOGIN_FAILED_ACTION,
    payload: { error },
  };
}

export type LoginActions = LoginAction | LoginSuccessAction | LoginFailedAction;

减速器:

import { LOGIN_ACTION, LOGIN_FAILED_ACTION, LOGIN_SUCCESS_ACTION, LoginActions } from '../../actions/login.action';
import {
  REQ_STATUS_FAIL,
  REQ_STATUS_PROCESSING,
  REQ_STATUS_SUCCESS,
  REQ_STATUS_UNDEFINED,
} from '../../common/request-status';

export interface LoginState {
  username: string;
  password: string;
  loginToken: string;
  loginError?: Error;
  status?: number;
}

export const initialState: LoginState = {
  username: '',
  password: '',
  loginToken: '',
  loginError: undefined,
  status: REQ_STATUS_UNDEFINED,
};

export function loginReducer(state: LoginState = initialState, action: LoginActions): LoginState {
  switch (action.type) {
    case LOGIN_ACTION:
      console.log('I was here', action.payload);
      return { ...state, username: action.payload.username, password: action.payload.password, status: REQ_STATUS_PROCESSING };

    case LOGIN_SUCCESS_ACTION:
      return { ...state, loginToken: action.payload.loginToken, status: REQ_STATUS_SUCCESS };

    case LOGIN_FAILED_ACTION:
      return { ...state, loginToken: '', loginError: action.payload.error, status: REQ_STATUS_FAIL };

    default:
      return state;
  }
}

问题是在访问有效内容的属性时出现很多类型错误,例如:action.payload.usernameaction.payload.password

Property 'username' does not exist on type '{ username: string; password: string; } | { loginToken: string; } | { error: Error; }'.
Property 'username' does not exist on type '{ loginToken: string; }'

Property 'password' does not exist on type '{ username: string; password: string; } | { loginToken: string; } | { error: Error; }'.
Property 'password' does not exist on type '{ loginToken: string; }'.

你可以帮帮我吗?

提香·切尔尼科娃·德拉戈米尔

您正在尝试在打字稿中使用区分的联合。区分联合使用switch语句来根据给定的属性(type在您的情况下)缩小每个分支的类型区分联合的要求是,type属性必须为文字类型(在您的情况下为字符串文字类型)。由于您为操作的类型定义了常量,因此可以typeof constant用来获取为常量推断的字符串文字类型。

interface Action { } // Dummy for self contained sample
export const LOGIN_ACTION = 'login';
export const LOGIN_SUCCESS_ACTION = 'login-sucesss';
export const LOGIN_FAILED_ACTION = 'login-failed';

export interface LoginAction extends Action {
  type: typeof LOGIN_ACTION; // !! here we assign the string literal type of the constant
  payload: {
    username: string;
    password: string;
  };
}

export function login(username: string, password: string): LoginAction {
  return {
    type: LOGIN_ACTION,
    payload: { username, password },
  };
}

export interface LoginSuccessAction extends Action {
  type: typeof LOGIN_SUCCESS_ACTION; // !! here we assign the string literal type of the constant
  payload: {
    loginToken: string;
  };
}

export function loginSuccess(loginToken: string): LoginSuccessAction {
  return {
    type: LOGIN_SUCCESS_ACTION,
    payload: { loginToken },
  };
}

export interface LoginFailedAction extends Action {
  type: typeof LOGIN_FAILED_ACTION; // !! here we assign the string literal type of the constant
  payload: {
    error: Error;
  };
}

export function loginFailed(error: Error): LoginFailedAction {
  return {
    type: LOGIN_FAILED_ACTION,
    payload: { error },
  };
}

export type LoginActions = LoginAction | LoginSuccessAction | LoginFailedAction;


export interface LoginState {
  username: string;
  password: string;
  loginToken: string;
  loginError?: Error;
  status?: number;
}

export const initialState: LoginState = {
  username: '',
  password: '',
  loginToken: '',
  loginError: undefined,
  status: 0,
};

export function loginReducer(state: LoginState = initialState, action: LoginActions): LoginState {
  // Type guard fro discriminated union.
  switch (action.type) {
    case LOGIN_ACTION:
      console.log('I was here', action.payload);
      // action is LoginAction here
      return { ...state, username: action.payload.username, password: action.payload.password, status: 0};

    case LOGIN_SUCCESS_ACTION:
      // action is LoginSuccessAction here
      return { ...state, loginToken: action.payload.loginToken, status: 1 };

    case LOGIN_FAILED_ACTION:
      // action is LoginFailedAction here 
      return { ...state, loginToken: '', loginError: action.payload.error, status: -1 };

    default:
      return state;
  }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

TypeScript:禁止联合类型的“类型上不存在属性”

如何使用 TypeScript 访问 React State 属性?类型错误时获取属性不存在

ReactJS 中的 Typescript 错误 - 类型上不存在属性

TypeScript中的“ EventTarget”类型错误不存在属性“文件”

联合体类型上不存在Typescript属性

TypeScript中的类型不存在属性

具有typescript的react.js,状态的类型对象错误不存在属性

TypeScript错误:类型“ Navigator”上不存在属性“ app”

Typescript 的“对象”错误类型上不存在属性

使用TypeScript时获取类型的属性不存在错误

TypeScript编译错误-类型上不存在属性

typescript属性“选项”在联合体类型的类型上不存在

TypeScript类型不存在属性“ load”?

Typescript:组合类型不存在属性?

枚举类型不存在Typescript属性

使用TypeScript在Redux reducer中的类型上不存在属性吗?

类声明-TypeScript中的类型不存在属性

TypeScript中的EventTarget类型不存在属性“值”

Typescript中的类型“ Date”上不存在属性“ getWeek”

Typescript中的XXX类型不存在属性'forEach'

Map 和 FlatMap 抛出错误“属性 'map' 在 Typescript 中的类型 'unknown' 上不存在

React组件中的TypeScript TS2339错误:类型“ IntrinsicAttributes ...”上不存在属性“ xyz”

如何修复 Typescript 中“元素”类型错误不存在的属性?

ReactJS/TypeScript - 类型“HTMLElement”错误中不存在属性“文件”

使用TypeScript的Phaser上的联合类型上不存在该属性

带有 TypeScript 的 React Native 中的“对象”类型不存在属性

联合体中不存在Typescript属性

TypeScript - 类型上不存在属性(但它存在)?

Typescript + React / Redux:类型'IntrinsicAttributes和IntrinsicClassAttributes不存在属性“ XXX”