如何仅将一种商店类型传递给组件(当商店是联合类型时)

时间:2019-03-06 23:13:58

标签: reactjs typescript redux type-safety

我正在将Typescript与React / Redux一起使用。

站点访问者可以处于stringLoggedIn两种状态之一。我已经相应地构造了状态:

LoggedOut

来自Haskell&Elm,这感觉很自然。从理论上讲,实现不可能访问interface LoggedIn { token: string, user: Data.User } interface LoggedOut { isLoading: boolean, lastAttempFailed: boolean } type Store = LoggedIn | LoggedOut undefined数据,因为它们只能访问与组件相关的状态(即,一旦用户登录,组件就无法访问)。访问null)。

如何将其与LoggedOut.isLoading集成?我有一个mapStateToProps组件为我的商店提供产品。我希望某些组件仅接受ProviderLoggedIn实例,而不是整个商店。

理想情况下,这将由父组件进行类型检查和传递,例如:

LoggedOut

但是,这很hacky,通过道具穿过商店感觉不习惯。 (此外:这也使得在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"/>; } } } 中使用路由参数非常困难。)

是否有一个很好的类型安全解决方案来解决此问题?干杯

1 个答案:

答案 0 :(得分:0)

以下应正确键入检查。不幸的是,我认为react-redux的{​​{1}}实用程序的类型定义不能正确支持在connect中映射的并集类型。

这仍然具有条件渲染,但是我看不出它与在Elm中使用模式匹配有什么不同。

mapStateToProps