当前位置: 首页 > 知识库问答 >
问题:

类型脚本:访问组件属性类型

寇坚成
2023-03-14

npm包@类型/反应允许我们在TypeScript应用程序中使用反应。我们将组件定义为

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, {}> {}

共有3个答案

齐建安
2023-03-14

从组件获取属性类型的步骤

type Props = typeof MyComponent.defaultProps;

你可以问自己为什么我要从defaultProps而不是ProTypes中获取typeof。为了解释这一点,让我们看看定义文件

  interface ComponentClass<P> {
        new(props?: P, context?: any): Component<P, ComponentState>;
        propTypes?: ValidationMap<P>;
        contextTypes?: ValidationMap<any>;
        childContextTypes?: ValidationMap<any>;
        defaultProps?: P;
        displayName?: string;
    }

正如您所看到的,PropType被包装在ValidationMap中,获取原始类型并不容易。幸运的是,DefaultProp具有原始类型

裴姚石
2023-03-14

从TypeScript 2.8开始,您可以使用条件类型,例如给定:

interface MyComponentProps { bar: string; }
declare const MyComponent: React.Component<MyComponentProps>;

interface MyComponentClassProps { bar: string; }
declare const MyComponentClass: React.ComponentClass<MyComponentClassProps>;

interface MyStatelessComponentProps { bar: string; }
declare const MyStatelessComponent: React.StatelessComponent<MyStatelessComponentProps>;

我们可以定义这些帮助程序:

type GetComponentProps<T> = T extends React.ComponentType<infer P> | React.Component<infer P> ? P : never

并像这样使用它们:

// $ExpectType MyComponentProps
type MyComponentPropsExtracted = GetComponentProps<typeof MyComponent>

// $ExpectType MyComponentClassProps
type MyComponentClassPropsExtracted = GetComponentProps<typeof MyComponentClass>

// $ExpectType MyStatelessComponentProps
type MyStatelessComponentPropsExtracted = GetComponentProps<typeof MyStatelessComponent>

更新2018-12-31:现在可通过React在官方React打字中使用。组件属性

阮鸿煊
2023-03-14

2019年:注意到上面所有的答案都很过时,所以这里有一个新的。

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

type ViewProps = View['props']

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

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

type ViewProps = React.ComponentProps<typeof View>

type InputProps = React.ComponentProps<'input'>

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

  • 开发商的意图更加明确

所有这些都使这个解决方案成为最经得起未来考验的解决方案:如果您决定从类迁移到钩子,您将不需要重构任何客户机代码。

 类似资料:
  • 问题内容: npm软件包允许我们在TypeScript应用程序内部使用React。我们将组件定义为 在这里,我们必须声明组件属性和状态的类型(在类型变量中)。 在声明了这些类型之后,TypeScript将使用该类型来验证组件的用法(传递给它的道具的形状)。 我想围绕这样的组件创建一个容器。容器将重复使用组件的道具。但是,为了创建具有相同道具的另一个组件,我必须再次重新声明道具的类型。或从原始组件文

  • 嗨,我是Java泛型的新手,我正在尝试访问泛型类中的属性。到目前为止,我已经找到了C#相关的答案,如果有人能指导我如何在java中做到这一点,那将是非常有帮助的。假设我有Class Car,它有整数型轮子和字符串型模型的属性。现在我有一个方法,比如

  • 问题内容: 我正在尝试从Objective-C 访问Swift类的属性。 在另一个视图控制器中,我尝试按以下方式进行访问: 而我得到 在类型’BusinessDetailViewController *’的对象上找不到属性’lat’ 为什么我不能访问此属性?我想念什么? 问题答案: 非Objective-C类型的可选值不会桥接到Objective-C中。也就是说,前三个属性下面 会 是在Objec

  • 错误: 类型{儿童:字符串;严重性:字符串;sx:{宽度:字符串; }; }' 不能分配给类型'Intrinsic属性 警报组件 使用警报组件

  • 您好,我正在建立一个动物园微服务,包括动物、员工、客户和价格表。我的动物微服务可以工作,但在我的员工微服务中,我遇到了一个错误,即没有为类型“EmployeeModel”找到属性“name”。在问这个问题之前,我已经在网上搜索了几个小时,还有一些类似的问题。我在模型中没有“名字”employee_name,我只是感到困惑,不知道如何修复它。任何指导/建议/信息将不胜感激:)第一次发布,所以我希望我

  • 我从React应用程序(next.js)上的TypeScript开始,不知道如何键入React组件。 我有一个组件像。。。 但这给了我以下错误: VAR子元素:JSX. Element 类型'Element'不能分配给类型'FC 我还试图让它简单地使用: 但这会在子组件中产生以下错误。 (别名)函数SiteLayout({children}:Props):JSX。Element import Si