Reactjs 如何从自定义React组件继承而不丢失流类型信息?

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

我有一个BaseComponent,它继承自
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可以解决问题。
    答案中应直接包含相关代码