Reactjs 如何从自定义React组件继承而不丢失流类型信息?
我有一个BaseComponent,它继承自Reactjs 如何从自定义React组件继承而不丢失流类型信息?,reactjs,flowtype,Reactjs,Flowtype,我有一个BaseComponent,它继承自React.Component。应用程序中的所有其他组件都继承自BaseComponent。我需要键入BaseComponent,以便从它继承的其他组件通过流作为React组件处理。这就是我目前拥有的: class BaseComponent<P, S> extends React.Component<$Shape<P>, P, S> { ... } class OtherComponent extends B
React.Component
。应用程序中的所有其他组件都继承自BaseComponent
。我需要键入BaseComponent
,以便从它继承的其他组件通过流作为React组件处理。这就是我目前拥有的:
class BaseComponent<P, S> extends React.Component<$Shape<P>, P, S> {
...
}
class OtherComponent extends BaseComponent {
props: {};
state: {}:
...
}
类BaseComponent扩展了React.Component{
...
}
类OtherComponent扩展了BaseComponent{
道具:{};
国家:{}:
...
}
这是一个例子。
Flow在OtherComponent
中正确检查道具、状态等
然而,在BaseComponent中,我得到了一些模糊的错误:
S:此类型与“未定义”不兼容。您忘记声明S了吗?
p:此类型与“未定义”不兼容。您忘记申报P了吗?
您是否忘记声明一些不兼容的
S实例化?:此类型与“一些不兼容的
S实例化”不兼容。
class BaseComponent<D, P, S> extends React.Component<D, P, S> {
static defaultProps: D
props: P
state: S
yourCustomFunction(): void
}
class You extends BaseComponent<any, any, any> {
--- component body ---
}
类BaseComponent扩展了React.Component{
静态默认道具:D
道具:P
州:S
yourCustomFunction():void
}
类扩展BaseComponent{
---组件体---
}
经过大量的实验,我最终得出了这样的结论。它似乎工作正常:
class BaseComponent<Props:Object, State, DefaultProps: $Shape<Props>> extends React.Component<DefaultProps, Props, State> {
static defaultProps: $Abstract<DefaultProps>;
props: Props;
state: $Abstract<State>;
}
类BaseComponent扩展了React.Component{
静态默认道具:$Abstract;
道具:道具;
国家:摘要;
}
除了将类型参数传递给
React.Components
之外,关键是在baseComponent
上定义props/state/和defaultProps。我不确定为什么有必要这样做,但它确实解决了问题。为了让我的代码能够处理数量可变的泛型参数,我最后键入了组件:
export default class NewComponent<P, S = {}> extends Component<P, S> {
props: P
state: S
...
}
导出默认类NewComponent扩展组件{
道具:P
州:S
...
}
您使用P
和S
参数化了BaseComponent
。当扩展BaseComponent
时,需要为其提供值。再见。@FelixKling谢谢!我正在传递类型值。我添加了一个flowtype.org/try示例来演示这个问题。我只是想澄清一下,我所做的操作会导致流正确地键入OtherComponent
,但会显示BaseComponent
的错误。看看工作示例。啊,很有趣。在BaseComponent
中重新迭代props/state/defaultProps可以解决问题。答案中应直接包含相关代码