Как набирать действия Redux и редукторы Redux в TypeScript?

Каков наилучший способ разыгратьaction параметр в редуксередуктор с машинописью? Будет несколько интерфейсов действий, которые могут расширять базовый интерфейс с типом свойства. Расширенные интерфейсы действий могут иметь больше свойств, которые различаются между интерфейсами действий. Вот пример ниже:

interface IAction {
    type: string
}

interface IActionA extends IAction {
    a: string
}

interface IActionB extends IAction {
    b: string
}

const reducer = (action: IAction) {
    switch (action.type) {
        case 'a':
            return console.info('action a: ', action.a) // property 'a' does not exists on type IAction

        case 'b':
            return console.info('action b: ', action.b) // property 'b' does not exists on type IAction         
    }
}

Проблема в том, чтоaction должен быть приведен как тип, который имеет доступ к обоимIActionA а такжеIActionB поэтому редуктор может использовать какaction.a а такжеaction.a без выдачи ошибки.

У меня есть несколько идей, как обойти эту проблему:

В роляхaction вany.Используйте дополнительные элементы интерфейса.

пример:

interface IAction {
    type: string
    a?: string
    b?: string
}
Используйте разные редукторы для каждого типа действия.

Каков наилучший способ организовать Action / Reducers в машинописи? Заранее спасибо!