Я хочу иметь возможность выводить тип свойства объекта на основе другого его свойства без необходимости объявления T, например, newType. Вместо этого объявляя newType и выводя T из свойства. См. Ниже:
export interface Action {
type: K;
payload: K extends "UPDATE_FIVE_DAY"
? {
fiveDayForecast?: FiveDayForecast;
fiveDayExpiresAt?: Moment;
fiveDayLocationFor?: Location;
}
: K extends "UPDATE_LOADING"
? { loading: boolean }
: K extends "UPDATE_LOCATION"
? { location: Location }
: K extends "UPDATE_SETTINGS"
? { settings: Settings }
: undefined;
}
У меня проблема в том, что переменная K
не существует, я могу настроить ее следующим образом:
export interface Action<K extends 'UPDATE_FIVE_DAY' | 'UPDATE_LOADING' | ...etc
Однако тогда мне нужно объявить тип action.type, который я не обязательно знаю. Я хочу использовать тип, как показано ниже:
Я хочу использовать это действие в обобщенном c редукторе как таковом:
export default (state: State = initialState, action: Action): State => {
switch (action.type) {
case "UPDATE_LOADING":
return {
...state,
loading: action.payload,
};
}
});
Однако оператор return выдает ошибку типа, так как считает, что action.payload может быть любым из возможных типов возврата. Что не соответствует действительности.