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, {}> {}
从组件获取属性类型的步骤
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具有原始类型
从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打字中使用。组件属性
。
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