TypeScript и Redux: зачем мне добавлять `| undefined` для моего типа состояния редуктора? - PullRequest
1 голос
/ 22 апреля 2019

Почему я не могу просто так набрать свой редуктор, не добавив "| undefined" к моему типу состояния редукса?

const reducer: Reducer<ReduxState> = function(state: ReduxState, action: any) ...

Дополнительный контекст ::::

Это работает нормально:

export const reducer: Reducer<ReduxState | undefined> = function (
    state: ReduxState | undefined, 
    action: any
) {
    return state
}
export default reducer

Однако это не происходит при удалении параметра состояния "undefined" из fxn:

export const reducer: Reducer<ReduxState | undefined> = function (
    state: ReduxState, 
    action: any
) {
    return state
}
export default reducer

, который дает ошибку:

Type '(state: ReduxState, action: any) => ReduxState' is not assignable to type 'Reducer<ReduxState | undefined, AnyAction>'.
  Types of parameters 'state' and 'state' are incompatible.
    Type 'ReduxState | undefined' is not assignable to type 'ReduxState'.
      Type 'undefined' is not assignable to type 'ReduxState'.ts(2322)

или это:

export const reducer: Reducer<ReduxState> = function (
    state: ReduxState | undefined, 
    action: any
) {
    return state
}
export default reducer

, который дает сообщение об ошибке:

Type '(state: ReduxState | undefined, action: any) => ReduxState | undefined' is not assignable to type 'Reducer<ReduxState, AnyAction>'.
  Type 'ReduxState | undefined' is not assignable to type 'ReduxState'.
    Type 'undefined' is not assignable to type 'ReduxState'.ts(2322)

И, наконец, это также не работает:

import {ReduxState, ReduxAction, ReduxActionType} from './types'
import {Reducer} from 'redux'

export const reducer: Reducer<ReduxState> = function (
    state: ReduxState, 
    action: any
) {
    return state
}
export default reducer

с ошибкой сообщения:

Type '(state: ReduxState, action: any) => ReduxState' is not assignable to type 'Reducer<ReduxState, AnyAction>'. Types of parameters 'state' and 'state' are incompatible. Type 'ReduxState | undefined' is not assignable to type 'ReduxState'. Type 'undefined' is not assignable to type 'ReduxState'.ts(2322)

TL;DR: Typescript не в восторге от моего Reducer, если я специально не разрешу тип "ReduxState | undefined" в Reducer<ReduxState|undefined> и function(state: ReduxState | undefined).

1 Ответ

3 голосов
/ 22 апреля 2019

Поскольку для начального состояния предыдущее состояние не определено. Следовательно, ваша функция должна иметь возможность иметь дело с state как undefined, вот что говорит вам первая ошибка.

Вторая версия не работает, потому что вы return state, и это может быть неопределенным (поскольку вы не проверяете, не определена ли она), и, следовательно, тип возвращаемого значения этой функции (который является универсальным аргументом) до Reducer) также должно быть возможно неопределенным. Вы могли бы защититься от этого:

  if(state === undefined)
     return { /*...*/ };
  else return state;

тогда Reducer<ReduxState> будет правильно описывать тип.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...