当前位置: 首页 > 面试题库 >

TypeScript与Redux容器作斗争

谭泉
2023-03-14
问题内容

我在弄清楚如何正确键入Redux容器时遇到一些麻烦。

考虑一个可能如下所示的简单演示组件:

interface MyProps {
  name: string;
  selected: boolean;
  onSelect: (name: string) => void;
}
class MyComponent extends React.Component<MyProps, {}> { }

从该组件的角度来看,所有道具都是必需的。

现在,我想编写一个容器,将所有这些道具拉出状态:

function mapStateToProps(state: MyState) {
  return {
    name: state.my.name,
    selected: state.my.selected
  };
}

function mapDispatchToProps(dispatch: IDispatch) {
  return {
    onSelect(name: string) {
      dispatch(mySelectAction(name));
    }
  };
}

const MyContainer = connect(
  mapStateToProps,
  mapDispatchToProps
)(MyComponent);

这行得通,但是存在一个很大的类型问题:映射函数(mapStateToPropsmapDispatchToProps)没有保护它们提供正确的数据来实现MyProps。这容易出现错误,错别字和不良的重构。

我可以使映射函数返回类型MyProps

function mapStateToProps(state: MyState): MyProps { }

function mapDispatchToProps(dispatch: IDispatch): MyProps { }

但是,除非我将所有MyProp道具都设为可选,否则这将无法工作,以便每个映射函数只能返回他们关心的部分。我不想使道具成为可选项,因为它们对于呈现组件不是可选的。

另一种选择是为每个map函数拆分道具,并将它们组合为组件道具:

// MyComponent
interface MyStateProps {
  name: string;
  selected: boolean;
}

interface MyDispatchProps {
  onSelect: (name: string) => void;
}

type MyProps = MyStateProps & MyDispatchProps;

class MyComponent extends React.Component<MyProps, {}> { }

// MyContainer
function mapStateToProps(state: MyState): MyStateProps { }

function mapDispatchToProps(dispatch: IDispatch): MyDispatchProps { }

好的,这使我离想要的东西越来越近,但是它有点嘈杂,使我无法按照容器的形状编写我的演示性组件prop接口。

现在出现了第二个问题。如果我要将容器放在另一个组件中怎么办:

<MyContainer />

这使编译错误是nameselectedonSelect无一不缺......但是,由于容器连接到终极版,并提供那些故意的。因此,这促使我将所有组件道具都设置为可选,但我不喜欢这样做,因为它们并不是真正的可选。

MyContainer有一些自己想要传递的道具时,情况会变得更糟:

<MyContainer section="somethng" />

现在,我想要做的是有section一个必需的道具MyContainer,但不是一个道具MyComponent,和nameselected以及onSelect需要的道具MyComponent,但可选的,或者不是在所有的道具MyContainer。我完全不知如何表达这一点。

任何指导对此将不胜感激!


问题答案:

您上一个示例在正确的轨道上。您还需要定义一个MyOwnProps接口,然后键入connect函数。

使用以下类型:https :
//github.com/DefinitelyTyped/DefinitelyTyped/blob/master/react-redux/react-
redux.d.ts
,您可以执行以下操作

interface MyProps {
  section: string;
  name: string;
  selected: boolean;
  onSelect: (name: string) => void;
}

interface MyStateProps {
  name: string;
  selected: boolean;
}

interface MyDispatchProps {
  onSelect: (name: string) => void;
}

interface MyOwnProps {
  section: string;
}

class MyComponent extends React.Component<MyProps, {}> { }

function mapStateToProps(state: MyState): MyStateProps { }

function mapDispatchToProps(dispatch: IDispatch): MyDispatchProps { }

const MyContainer = connect<MyStateProps, MyDispatchProps, MyOwnProps>(
  mapStateToProps,
  mapDispatchToProps
)(MyComponent);

这也让你输入ownPropsmapStateToPropsmapDispatchToProps,如

function mapStateToProps(state: MyState, ownProps: MyOwnProps): MyStateProps

只要定义了调度,状态和ownProps类型,就不需要为MyProps类型定义交集类型。这样,您可以将MyProps保留在自己的位置,并让容器(或没有容器使用组件的地方)根据需要应用道具。我想这取决于您和您的用例-
如果您定义MyProps = MyStateProps & MyDispatchProps & MyOwnProps,则将其绑定到一个特定的容器,该容器的灵活性较差(但不太冗长)。

作为解决方案,它非常冗长,但是我认为没有办法告诉TypeScript所需的道具的不同部分将在不同的地方组装connect并将它们绑在一起。

另外,为了简单起见,为了简单起见,我通常会带可选的道具,因此在使用这种方法时,我没有太多经验可以分享。



 类似资料:
  • 我正在尝试让redux-form与TypeScript和Styled-Components一起工作。在下面的代码示例中,为什么它不能与样式化的输入组件一起工作?输入呈现出来,但每个按键都失去了焦点。还需要单击两次来聚焦元素。看起来redux-form试图控制Styled-Components返回的包装元素?redux-form和styled-components都使用HOC高阶组件将道具传递给底层

  • 问题内容: 我是redux反应开发的初学者。我想知道什么是演示组件和容器组件。 如何将组件分类为Presentational或Container? 两者有什么区别? 这样对组件进行分类有什么好处? 问题答案: 您会发现您的组件更容易重用,并考虑将它们分为两类。我称它们为容器和演示组件。 我假设您已经了解Redux架构 容器组件 意识到redux 订阅Redux状态 派遣到redux动作 由reac

  • 我花了一段时间研究以下算法: 你会得到不同面额的硬币和总金额。写一个函数来计算你需要的最少数量的硬币来组成这个数量。如果这些硬币的任何组合都不能弥补这个金额,返回-1。 例1:币=[1,2,5],金额=113 (11 = 5 5 1) 例2:硬币=[2],金额=3返回-1。 注意:你可以假设每种硬币的数量是无限的。 这可能不是解决问题的最有效方法,但我想我可以通过尝试每一个硬币并每次尝试启动一个新

  • 发布压力是快速推出好产品的压力。这是好的,因为它反映了市场事实,并且在某个意义上是健康的。时间压力是迫使一个产品更快地推出的压力,这是浪费的,不健康的,并且太普遍了。 时间压力的存在是有原因的。给程序员任务的人们没有完全尊重我们的强烈的工作道德以及作为一个程序员的乐趣。可能是因为他们对我们所做的事情,他们相信,要求更快会让我们更加努力工作,使得工程更快完成。这可能确实是对的,但效果很小,损害很大。

  • 我对javaee/EJB比较陌生,我已经读了很多关于javaee容器的书。我有使用web容器(JBoss中的WAR文件)的经验。我还知道JBoss也可以用作JavaEE容器。 JavaEE容器和Web容器之间的区别是什么? 我知道JavaEE也能够包含一个。战争档案。它们不同吗?它们的区别是什么?是否有特定于供应商的偏好,哪一个更好?

  • 问题内容: 我正在为当前的Web应用程序使用Redux和Typescript。 定义通过来接收redux-actions的组件的props以及从parent 接收props的最优方法是什么?例: 如我所见,我有2个解决方案。 只需通过我的整个应用程序传递操作并说明状态即可。但这意味着即使需要更改一些小的子组件,我的整个应用也会重新渲染。还是在所有商店更改中侦听我的顶级组件的替代方法?然后,我将不得