Есть два способа сделать это.
Вы можете объявить тип один раз:
const withoutSwitchReducer: { [k in ActionTypesEnum]: (action: Extract<ActionTypes, { type: k }>) => string } = {
[ActionTypesEnum.FOO]: (action) => {
return action.payload.username;
},
[ActionTypesEnum.BAR]: (action) => {
return action.payload.password;
},
};
Или вы можете описать их индивидуально:
const withoutSwitchReducer2 = {
[ActionTypesEnum.FOO]: (action: Extract<ActionTypes, { type: ActionTypesEnum.FOO }>) => {
return action.payload.username;
},
[ActionTypesEnum.BAR]: (action: Extract<ActionTypes, { type: ActionTypesEnum.BAR }>) => {
return action.payload.password;
},
};
Преимущество объявления типа один раз заключается в том, что вам не нужно делать одно и то же снова и снова, но их индивидуальное описание позволяет вам извлечь выгоду из определения типа возврата этих функций.
ОБНОВЛЕНИЕ: как Тициан Черникова-Драгомир упоминается в комментарии, вы можете объявить его как тип для повторного использования в другом месте:
type ReducerMap<T extends { type: string }> = { [P in T['type']]: (action: Extract<T, { type: P }>) => any }
Тип возвращаемого значения функции - any
.Я попытался найти способ вывести это на фактическое возвращаемое значение каждого определения, но это вряд ли возможно.
И поскольку он используется в качестве карты редуктора, вы, вероятно, не будете заботиться о возвращаемом значениикак это потребляется каркасом.