import * as React from "react"; import { observer } from "mobx-react"; export function project(projection: (model: Model) => View) { return { render( render: (props: ExtraProps & { model: Model } & { view: View }) => JSX.Element ): React.ComponentClass { return observer(class extends React.Component { private view: View; private model: Model; constructor(props: ExtraProps & { model: Model }) { super(props); this.model = props.model; this.view = projection(props.model); } componentWillReceiveProps(props: ExtraProps & { model: Model }) { if (props.model !== this.model) { this.model = props.model; this.view = projection(props.model); } } render() { return render({ ...this.props as any, view: this.view }); } }); } } }