【问题标题】:TS2339 Typescript error but unsure why... property does not exist on typeTS2339 Typescript 错误但不确定为什么...类型上不存在属性
【发布时间】:2020-07-17 14:06:15
【问题描述】:

我对 Typescript 比较陌生,目前正在构建一个包含 Redux 的 React 应用程序,并且正在使用 Typescript。

Typescript 在我的减速器中给我以下错误;

ERROR in /Users/<REDACTED>/web/src/redux/reducers/steppedViews.ts
./src/redux/reducers/steppedViews.ts
[tsl] ERROR in /Users/<REDACTED>/web/src/redux/reducers/steppedViews.ts(13,53)
      TS2339: Property 'activeView' does not exist on type '{ activeView: number; } | { totalViews: number; }'.
  Property 'activeView' does not exist on type '{ totalViews: number; }'.

ERROR in /Users/<REDACTED>/web/src/redux/reducers/steppedViews.ts
./src/redux/reducers/steppedViews.ts
[tsl] ERROR in /Users/<REDACTED>/web/src/redux/reducers/steppedViews.ts(15,53)
      TS2339: Property 'totalViews' does not exist on type '{ activeView: number; } | { totalViews: number; }'.
  Property 'totalViews' does not exist on type '{ activeView: number; }'.

我的动作类型定义如下

export interface SetActiveView {
  type: typeof types.steppedViews.SET_ACTIVE_VIEW;
  payload: {
    activeView: number;
  };
}

export interface SetTotalViews {
  type: typeof types.steppedViews.SET_TOTAL_VIEWS;
  payload: { totalViews: number };
}

export type ReduxActionsSteppedViews = SetActiveView | SetTotalViews;

我的减速器是

import types from '../types';
import { ReduxActionsSteppedViews } from '../actions/steppedViews';

export interface ReduxStateSteppedView {
  activeView: number;
  totalViews: number;
}
const initialState: ReduxStateSteppedView = { activeView: 0, totalViews: 0 };

const reducer = (state = initialState, action: ReduxActionsSteppedViews): ReduxStateSteppedView => {
  switch (action.type) {
    case types.steppedViews.SET_ACTIVE_VIEW:
      return { ...state, activeView: action.payload.activeView };
    case types.steppedViews.SET_TOTAL_VIEWS:
      return { ...state, totalViews: action.payload.totalViews };
    default:
      return state;
  }
};

export default reducer;

我很困惑为什么会发生这种情况,因为根据我的理解,定义的类型是 '{activeView: number;} | {totalViews: number;}' 所以它应该能够看到 *.activeView 或 *.totalViews。

任何有关此错误的指导将不胜感激。谢谢!

【问题讨论】:

    标签: reactjs typescript redux react-redux


    【解决方案1】:

    声明的类型是{activeView: number;} | {totalViews: number;},所以ReduxActionsSteppedViews.payload中的activeView和totalViews都不是必需的属性

    Typescript 不知道你是否检查过类型(在你的情况下),所以你需要告诉她:

    const reducer = (state = initialState, action: ReduxActionsSteppedViews): ReduxStateSteppedView => {
      switch (action.type) {
        case types.steppedViews.SET_ACTIVE_VIEW:
          return { ...state, activeView: (<SetActiveView> action).payload.activeView };
        case types.steppedViews.SET_TOTAL_VIEWS:
          return { ...state, totalViews:(< SetTotalViews> action).payload.totalViews };
        default:
          return state;
      }
    };
    

    【讨论】:

    • 感谢您的回答。这当然起到了作用,但感觉不是很整洁。有没有办法可以更改我的代码以使其更整洁?我按照 react-redux 指南在 typescript 中使用它来获得操作的合并类型定义。或者这个解决方案可以接受吗?
    • 如果您不喜欢只创建一个接口,将两个接口与? 和` |` 运算符合并,我认为这是唯一的方法。 :)
    • 另见:stackoverflow.com/questions/62956678/…,这篇文章可能会帮助你理解条件类型
    猜你喜欢
    • 1970-01-01
    • 2016-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-14
    • 2018-03-25
    • 2020-04-25
    • 1970-01-01
    相关资源
    最近更新 更多