反应-在TypeScript中将组件与子组件组成

时间:2018-10-11 10:45:03

标签: reactjs typescript static composition subcomponent

react-bootstrap使您可以使用以下方式创建模式组件:

<Modal>
    <Modal.Header>
        <Modal.Title>Modal heading</Modal.Title>
    </Modal.Header>
    <Modal.Body>
        <h4>Text in a modal</h4>
    </Modal.Body>
    <Modal.Footer>
        <Button>Close</Button>
    </Modal.Footer>
</Modal>

我想组成模态组件并创建一个MyModal组件:

import * as React from 'react';
import { Modal, ModalBody, ModalProps } from 'react-bootstrap';

interface Props extends ModalProps {
  plain?: boolean;
}

class MyModal extends React.Component<Props> {

  static Body: typeof ModalBody;

  constructor(props: Props) {
    super(props);
  }

  render() {
    const { plain, ...other } = this.props;
    return (
      <Modal className={plain ? 'plain' : ''} {...other} />
    );
  }
}

export default MyModal;

但是如果我这样使用它:

import MyModal from './MyModal';

...

render() {
  return (
    <MyModal plain={true}>
      <MyModal.Body>
        <p>Hello!</p>
      </MyModal.Body>
    </MyModal>
  );
}

我收到以下错误:

警告:React.createElement:类型无效-预期为字符串(对于内置组件)或类/函数(对于复合组件),但得到:未定义。您可能忘记了从定义文件中导出组件,或者可能混淆了默认导入和命名导入。

知道发生了什么事吗?

1 个答案:

答案 0 :(得分:1)

static Body: typeof ModalBody;

undefined,因此不能用作<MyModal.Body>

如果它是从包装的组件继承的,则应为:

static Body = ModalBody;

推断出Body类型的地方。

使用TypeScript strictstrictNullChecks)编译器选项可以避免此问题。