Запуск в ошибке несоответствия типов состояния Typescript внутри файла хранилища Redux - PullRequest
0 голосов
/ 20 февраля 2019

Мне кажется, что у меня все типы правильные, однако я пропускаю другой тип Reducer?

IinitialAssetsState 'нельзя назначить типу' Reducer '

Полная ошибка:

Тип' (состояние: {assets: never[]; портфолио: никогда []; загрузка: логическое значение;} | undefined, action: any) => IinitialAssetsState 'нельзя назначить типу' Reducer '.

Типы параметров' state 'и' state 'несовместимы.

Тип 'IinitialAssetsState |undefined 'нельзя назначить типу' {assets: never [];портфолио: никогда [];загрузка: логическое значение;} |undefined '.

Тип' IinitialAssetsState 'нельзя назначить типу' {assets: never [];портфолио: никогда [];загрузка: логическое значение;} '.

Типы свойств' assets 'несовместимы.

Тип' IAsset [] 'не может быть назначен типу' never [] '.

Тип' IAsset'нельзя назначить типу' never '.

enter image description here

My store.ts file

import { applyMiddleware, createStore, combineReducers } from 'redux'
import { composeWithDevTools } from 'redux-devtools-extension'
import thunkMiddleware from 'redux-thunk'

import { IinitialState } from './shared/types'
import { AssetsReducer } from './reducers/assets'
import { BoardReducer } from './reducers/board'

const rootReducer = combineReducers({
  AssetsReducer,
  BoardReducer
});

export const defaultInitialState = {
  AssetsReducer: { assets: [], loading: false, portfolio: [] },
  BoardReducer: { overlay: false },
}

export function initializeStore(initialState: IinitialState = defaultInitialState) {
  return createStore(
    rootReducer,
    initialState,
    composeWithDevTools(applyMiddleware(thunkMiddleware))
  )
}

AssetsReducer

import { Actions } from '../actions/assets'
import { IinitialAssetsState } from '../shared/types'

const defaultAssetsState = { assets: [], portfolio: [], loading: false };

export const AssetsReducer = (state = defaultAssetsState, action: any): IinitialAssetsState => {
  switch (action.type) {
    case Actions.GET_ALL_ASSETS: {
      const { assets } = action;
      return {
        ...state,
        assets,
        loading: false
      };
    }

    default:
      return state;
  }
};

BoardReducer

import { Actions } from '../actions/board'
import { IinitalBoardState } from '../shared/types'

const defaultBoardState = { overlay: false };

export const BoardReducer = (state = defaultBoardState, action: any): IinitalBoardState => {
  switch (action.type) {
    case Actions.SET_OVERLAY_STATE: {
      const { overlay } = action;
      return {
        overlay
      };
    }

    default:
      return state;
  }
};

Файл моих типов

export interface IAsset {
  position: number;
  marketCap: number;
  name: string;
  percentage: number;
  price: number;
  currency: string;
  value: number;
}

export interface IinitialAssetsState {
  assets: IAsset[];
  portfolio: IAsset[];
  loading: boolean;
}

export interface IinitalBoardState {
  overlay: boolean;
}

export interface IinitialState {
  AssetsReducer: IinitialAssetsState;
  BoardReducer: IinitalBoardState;
}

То, что я пробовал

Я создал тип для action, чтобы исключить использование any, но я все еще сталкиваюсь с той же ошибкой Typescript:

interface IAssetsAction {
  type: string;
  assets: IAsset[];
}

export const AssetsReducer = (state = defaultAssetsState, action: IAssetsAction): IinitialAssetsState => {
  console.log('action', action);
  switch (action.type) {
    case Actions.GET_ALL_ASSETS: {
      const { assets } = action;
      return {
        ...state,
        assets,
        loading: false
      };
    }

1 Ответ

0 голосов
/ 20 февраля 2019

Я полагаю, что это может быть проблемой в store.ts:

export const defaultInitialState = {
  AssetsReducer: { assets: [], loading: false, portfolio: [] },
  BoardReducer: { overlay: false },
}

Здесь defaultInitialState.assets имеет тип никогда [].

Вам необходимо установить тип для defaultInitialState

export const defaultInitialState : IinitialState  = {
  AssetsReducer: { assets: [], loading: false, portfolio: [] },
  BoardReducer: { overlay: false },
}

Редактировать: Также в AssetsReducer и BoardReducer

const defaultBoardState : IinitalBoardState = { overlay: false };

...