У меня есть следующие интерфейсы:
interface AppState {
readonly grid : IGridSettings;
readonly selected : ISelectedSettings;
}
interface IGridSettings {
readonly extents : number;
readonly isXY : boolean;
readonly isXZ : boolean;
readonly isYZ : boolean;
readonly spacing : number;
}
interface ISelectedSettings {
readonly bodyColor : number;
readonly colorGlow : number;
readonly lineColor : number;
readonly selection : number[] | undefined;
}
interface Action<T = any> {
type: T
}
interface SetPropertyValueAction<KAction extends keyof AppState, KActionProp extends keyof AppState[KAction]> extends Action {
type : string;
payload : {
property : [KAction, KActionProp];
value : IUserActions[KAction][KActionProp];
};
}
В конце концов мой редукторный редуктор вызывается при вызове функции setPropertyValue:
const setPropertyValue = <KAction extends keyof AppState, KActionProp extends keyof AppState[KAction]>( property : [KAction, KActionProp], value : AppState[KAction][KActionProp] ) : SetPropertyValueAction<KAction, KActionProp> => ( {
type: 'SET_PROPERTY_VALUE',
payload: {
property,
value,
}
} );
function myReducer( state : AppState = INITIAL_STATE, a : Action ) : AppState {
switch( a.type ) {
case 'SET_PROPERTY_VALUE': {
const action = a as SetPropertyValueAction; // <- error here
return createNewState( state, action.payload.property, action.payload.value );
}
}
return states;
}
Проблема, с которой я столкнулся, заключается в том, что я не знаю, как исправить приведение из Action в SetPropertyValueAction. TypeScript говорит мне, что ошибка:
Generic type 'SetPropertyValueAction<KAction, KActionProp>' requires 2 type argument(s).
Я попытался изменить строку кода с ошибкой следующим образом:
const action = a as SetPropertyValueAction<KAction extends keyof AppState, KActionProp extends keyof AppState[KAction]>;
... но это дает мне две ошибки: «Не удается найти имя KAction и KActionProp»
Как я могу привести объект Action к универсальному SetPropertyValueAction ??
Это дополнительный вопрос к моему другому вопросу, на который уже дан ответ: Как добавить безопасность типов TypeScript к моему действию приведения?