Я использую Typescript с React / Redux.
Посетитель сайта может находиться в одном из двух состояний: LoggedIn
или LoggedOut
.Я структурировал свое состояние соответственно:
interface LoggedIn {
token: string,
user: Data.User
}
interface LoggedOut {
isLoading: boolean,
lastAttempFailed: boolean
}
type Store = LoggedIn | LoggedOut
Исходя из Haskell & Elm, это кажется естественным.Теоретически, реализациям было бы невозможно получить доступ к данным undefined
или null
, поскольку они могли бы получить доступ только к состоянию, относящемуся к компонентам (т. Е. После входа пользователя компонент не может получить доступ к LoggedOut.isLoading
).
Как я могу интегрировать это с mapStateToProps
?У меня есть Provider
компонент, поставляющий мой магазин.Я хочу, чтобы определенные компоненты принимали только экземпляр LoggedIn
или LoggedOut
, а не весь магазин.
В идеале это проверяется типом и передается родительским компонентом, например:
class PrivateRouteComponent extends React.Component<OwnProps & ConnectedState, any> {
render() {
const { store, component, ...props } = this.props;
const Component = component;
switch (store.type) {
case "LOGGED_IN":
return <Route render={() => <Component store={store as Store.LoggedIn} {...props}/>}/>;
case "LOGGED_OUT":
return <Redirect to="/login"/>;
}
}
}
Но это глупо, и кажется, что пропускать магазин через реквизит не имеет смысла.(Помимо: это также очень затрудняет использование параметров маршрута в react-router
).
Есть ли хорошее, безопасное для типов решение этой проблемы?Приветствия