REACT - Композиция компонента с субкомпонентами в TypeScript
response-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: тип недействителен - ожидается строка (для встроенных компонентов) или класс / функция (для составных компонентов), но получено: undefined. Вероятно, вы забыли экспортировать свой компонент из файла, в котором он определен, или вы могли смешать импорт по умолчанию и с именами.
Есть идеи, что не так?
1 ответ
static Body: typeof ModalBody;
является undefined
поэтому его нельзя использовать как <MyModal.Body>
,
Если он унаследован от упакованного компонента, он должен быть:
static Body = ModalBody;
куда Body
тип выводится.
Этой проблемы можно избежать с помощью TypeScript strict
(strictNullChecks
Опция компилятора.