Ошибки TypeScript, когда я перемещаю случаи оператора switch в собственные функции? - PullRequest
2 голосов
/ 09 марта 2020

Я использую TypeScript с Redux. Этот код работает нормально:

export type action =
  | {
      type: "do-other-thing";
      name: string;
    }
  | {
      type: "do-something";
      index: number;
    };

function reducer(state: state = initState, action: action): state {
  switch (action.type) {
    case "do-something":
        if (action.index === 0) return state;
        // More logic
    case "do-other-thing":
        // More logic
    default:
        return state;
  }

Однако я хочу переместить регистры возврата из оператора switch в их собственные функции:

function doSomething(state: state, action : action): state {
    if (action.index === 0) return state;
    // more logic
}

function reducer(state: state = initState, action: action): state {
  switch (action.type) {
    case "do-something":
        return doSomething(state, action);
    case "do-other-thing":
        // More logic
    default:
        return state;
  }

Теперь функция doSomething имеет TypeScript ошибка:

Свойство 'index' не существует для типа 'action'. Свойство 'index' не существует для типа '{тип: "что-то делать"; ширина: число; isLandscape: логическое значение; } '. ts (2339)

Я вижу, что TypeScript не знает, что из-за оператора switch объект action будет иметь свойство index. Есть ли способ, чтобы это осознавать?

Ответы [ 2 ]

2 голосов
/ 09 марта 2020

Функция doSomething не работает со всеми действиями, но с действием со свойством index, я бы разделил некоторые наборы, чтобы иметь возможность более четко вводить требование:

type A = {
      type: "do-other-thing";
      name: string;
    };
type B = {
      type: "do-something";
      index: number;
    };
type Action = A | B

function doSomething(state: state, action: B): state {
    if (action.index === 0) return state;
    // more logic
}

Сейчас doSomething работает только с вариантом B вашего Action типа.

2 голосов
/ 09 марта 2020

Поскольку вы определили параметр как action в функции doSomething, это позволяет любому передавать любой action в других местах. Скорее всего, вы хотите определить его как более ограниченный тип, например:

type DoOtherThingAction = { type: "do-other-thing"; name: string; };
type DoSomeThingAction = { type: "do-something"; index: number; };
export type action = 
  | DoOtherThingAction
  | DoSomeThingAction;

, а затем:

function doSomething(state: state, action : DoSomeThingAction): state {
    if (action.index === 0) return state;
    // more logic
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...