我希望能够根据对象的另一个属性推断对象的属性类型,而不必像newType那样声明T。而是声明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的类型,我不一定知道。我想使用如下类型:
我想在一个通用的reducer中使用这个Action:
export default (state: State = initialState, action: Action): State => {
switch (action.type) {
case "UPDATE_LOADING":
return {
...state,
loading: action.payload,
};
}
});
然而,return语句抛出了一个类型错误,因为它认为action.payload可以是任何可能的返回类型。但事实并非如此。
发布于 2020-04-07 22:39:05
根据@shlang的建议,我设法使用有区别的联合来让它工作。
减速机:
export default (state: State = initialState, action: Actions): State => {
switch (action.type) {
case "UPDATE_LOADING":
return {
...state,
loading: action.payload.loading,
};
}
});
以及动作的类型:
export type Action = {
type: AllActionTypes;
payload: Partial<State> | undefined;
};
export type Actions =
| UpdateFiveDayAction
| UpdateLoadingAction;
export interface UpdateLoadingAction extends Action {
type: "UPDATE_LOADING";
payload: { loading: State["loading"] };
}
export interface UpdateFiveDayAction extends Action {
type: "UPDATE_FIVE_DAY";
payload: {
fiveDayForecast: State["fiveDayForecast"];
fiveDayExpiresAt: State["fiveDayExpiresAt"];
fiveDayLocationFor: State["fiveDayLocationFor"];
};
}
https://stackoverflow.com/questions/61090145
复制