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

打字稿React:访问组件属性类型

董子航
2023-03-14
问题内容

npm软件包@types/react允许我们在TypeScript应用程序内部使用React。我们将组件定义为

type Props = {...}

type State = {...}

export default class MyComponent extends React.Component<Props, State> {
}

在这里,我们必须声明组件属性和状态的类型(在类型变量中)。

在声明了这些类型之后,TypeScript将使用该类型来验证组件的用法(传递给它的道具的形状)。

我想围绕这样的组件创建一个容器。容器将重复使用组件的道具。但是,为了创建具有相同道具的另一个组件,我必须再次重新声明道具的类型。或从原始组件文件中导出它们并导入到容器中:

// original file
export type Props = {...}

// container file
import MyComponent, { Props } from './original'

但是我已经MyComponent从该文件导入了。该组件已经包含有关其消耗的道具的信息(感谢在中键入变量React.Component)。

问题是 如何在不显式导出/导入道具类型的情况下从组件类本身访问该信息

我想要类似的东西:

import MyComponent from './MyComponent'

type Props = MyComponent.Props // <= here access the component prop types

export default class MyContainer extends React.Component<Props, {}> {}

问题答案:

2019 :注意到上面的所有答案都已经过时了,所以这里是一个新鲜的答案。

查询类型

使用较新的TS版本,您可以使用查找类型。

type ViewProps = View['props']

尽管非常方便,但这 仅适用于类组件

React.ComponentProps

React typedef附带了一个实用程序,可从任何组件中提取道具的类型。

type ViewProps = React.ComponentProps<typeof View>

type InputProps = React.ComponentProps<'input'>

这有点冗长,但是与类型查找解决方案不同:

  • 开发人员的意图更加明确
  • 这将与功能组件和类组件一起使用

所有这些使该解决方案成为 最可靠的 解决方案:如果您决定从类迁移到挂钩,则无需重构任何客户端代码。



 类似资料:
  • 问题内容: React事件的正确类型是什么。最初,我只是为了简单起见而使用。现在,我正在尝试清理并避免完全使用。 所以像这样一个简单的形式: 我在这里使用什么类型作为事件类型? 似乎没有工作,因为我收到一个错误消息,并且不存在。 对于所有事件的更笼统的回答,我们将不胜感激。 谢谢 问题答案: 该SyntheticEvent接口是通用的: 并且是一般约束与的交集 。 另外,由于事件是由输入元素引起的

  • npm包允许我们在TypeScript应用程序中使用反应。我们将组件定义为 在这里,我们必须声明组件道具和状态的类型(在类型变量中)。 在我们声明了这些类型之后,TypeScript使用这些类型来验证组件的使用(传递给它的道具的形状)。 我想围绕这样一个组件创建一个容器。容器将重用组件的道具。但是为了用相同的道具创建另一个组件,我必须重新声明道具的类型。或者从原始零部件文件中导出它们并导入到容器中

  • 我想知道最好的方法,比如我有两个物体 如果objectC由创建 我如何声明/描述objectC,以便编译器/IDE知道它同时具有objectA和objectB的属性? 我想找到一种不需要为objectA和objectB定义接口的方法。我不想为同一个属性写两次声明和定义/求值。如果我在一个对象上有太多的属性,这种冗余是很重要的。 (是否有一个运算符可以提取现有对象的接口/类型?) 可能吗?

  • 问题内容: 我有一个像下面这样的课程: 我想为源变量传递一个字符串,并访问同名的类成员。 我已经尝试过仅对函数有效(据我所知)以及具有extend和using ,但这也不起作用。做这个的最好方式是什么? 问题答案: 如果命名self的ANY属性(包括您的示例中的),将可以完美地工作。

  • 我正在努力寻找 有什么不同?

  • 我正在用打字稿重写我的React应用程序。我正在尝试将所有组件实现为功能组件。 Typescript允许我们利用类型别名和接口来定义对象的形状或函数签名。我已经讲过了类型和接口的区别。 我读过的几乎所有文章都通过使用接口定义了一个组件,而这个接口本可以使用类型别名。据我所知,interface和type alias对于React组件给出了相同的结果,那么为什么几乎在每个定义中都使用了interfa