Допустим, у нас userReducer
определено так:
function userReducer(state: string, action: UserAction): string {
switch (action.type) {
case "LOGIN":
return action.username;
case "LOGOUT":
return "";
default:
throw new Error("Unknown 'user' action");
}
}
Каков наилучший способ определения типа UserAction
, поэтому можно будет вызывать dispatch
как с username
полезной нагрузкой, так и с без:
dispatch({ type: "LOGIN", username: "Joe"}});
/* ... */
dispatch({ type: "LOGOUT" });
Если тип определен следующим образом:
type UserActionWithPayload = {
type: string;
username: string;
};
type UserActionWithoutPayload = {
type: string;
};
export type UserAction = UserActionWithPayload | UserActionWithoutPayload;
Выдает компилятор и ошибка в редукторе в случае «ВХОДА»: TS2339: Property 'username' does not exist on type 'UserAction'. Property 'username' does not exist on type 'UserActionWithoutPayload'.
Если тип определяется с необязательным членом:
export type UserAction = {
type: string;
username?: string;
}
Тогда компилятор показывает эту ошибку: TS2322: Type 'string | undefined' is not assignable to type 'string'. Type 'undefined' is not assignable to type 'string'.
Чего здесь не хватает? Может быть, весь подход неверен?
Проект использует TypeScript 3.8.3 и React. js 16.13.0.