小能豆

Typescript React:访问组件属性类型

javascript

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

type Props = {...}

type State = {...}

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

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

在我们声明类型之后,TypeScript 会使用它来验证我们组件的使用情况(传递给它的 props 的形状)。

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

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

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

但我已经MyComponent从该文件导入了。此组件已包含有关其使用的 props 的信息(这要归功于 中的类型变量React.Component)。

问题是,如何在不明确导出/导入 props 类型的情况下从组件类本身访问该信息

我想要这样的东西:

import MyComponent from './MyComponent'

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

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

阅读 48

收藏
2024-06-05

共1个答案

小能豆

2019:注意到上面的所有答案都已过时,因此这里有一个新的答案。


查找类型

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

type ViewProps = View['props']

尽管非常方便,但它只适用于类组件


React.ComponentProps

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

type ViewProps = React.ComponentProps<typeof View>

type InputProps = React.ComponentProps<'input'>

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

  • 开发者的意图更加明确
  • 这将适用于功能组件和类组件

所有这些使该解决方案成为最具前瞻性的解决方案:如果您决定从类迁移到钩子,则不需要重构任何客户端代码。

2024-06-05