Редуктор <> Тип Redux не передает тип возврата должным образом? - PullRequest
1 голос
/ 05 марта 2019

Информация: Использование Typescript 3.3.3333 в Jetbrains Rider

Учитывая это определение типа Reducer<State, Action>:

* @template S The type of state consumed and produced by this reducer.
* @template A The type of actions the reducer can potentially respond to.
*/
export type Reducer<S = any, A extends Action = AnyAction> = (
  state: S | undefined,
  action: A
) => S

Почему тип возврата S не тип проверяет состояние, которое я возвращаю из редуктора, если я не определю его явно?

export const INITIAL_STATE: AuthenticationState = {
    authenticationInProgress: false,
    accessToken: null,
    tokenType: null,
    expiryTimeMs: null,
    errorInformation: null,
    isAdmin: false,
};

export const authenticationReducer: Reducer<AuthenticationState, 
    AuthenticationActions> = (state = INITIAL_STATE, action): 
(why is this necessary??) ->  AuthenticationState => {
        switch (action.type) {
            case "authentication/user_authentication_request": {
                return {
                    ...state,
    problem -> hello: "hi",
                    authenticationInProgress: true,
                };
            }
...

Поведение, которое я ожидаю, без необходимости определять AuthenticationState в качестве возвращаемого значения Behavior I expect without needing to define AuthenticationState as the return value

VS.

Почему больше нет проверки типа возвращаемого значения, если тип редуктора включает возвращаемое значение S? image Type includes the return value of S">

Любая потеря света и мудрость действительно приветствуются. Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 05 марта 2019

TLDR : это ожидаемое поведение в TypeScript из-за того, как проверка избыточного свойства работает.

В вашем случае заданная вами функция стрелки имеет возвраттип, который имеет избыточные (или дополнительные) свойства.Для TypeScript это совершенно нормально.

В упрощенном примере посмотрите на это поведение:

type a = () => { a: string };
type b = () => { a: string, b: string };

declare let myA: a;
declare let myB: b;

myA = myB; // OK! (excess properties are not checked)
myB = myA; // Error: missing required property 'b'

Суть вашей проблемы в том, что вы по существу присваиваете myB myA и ожидаетеошибка, но вы получите ошибку только при назначении myA на myB.

У вас есть несколько вариантов, чтобы заставить ваш код работать должным образом (например, тот, который вы предложили, где вы явно определяете тип возвращаемого значения), но ни один из них не идеален, пока TypeScript не поддерживает точный* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *} * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *.

0 голосов
/ 11 марта 2019

как сказал Кристиан Сантос , это ожидаемое поведение.

Если вы хотите испытать безопасный тип редукса, тогда я предлагаю вам взглянуть на какое-то редуксное расширение, которое было разработано с учетом этого!

проверить redux-fluent

enter image description here enter image description here

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