- Notifications
You must be signed in to change notification settings - Fork 471
Description
Components using @react.component/@jsx.component etc should always return JSX. But, there's currently nothing enforcing them to do that. In practice, they error as soon as they're used with other JSX (because JSX expects JSX), but the errors are quite cryptic, and it takes a while to understand that the problem is that you're not returning JSX from your component.
Therefore, we should add a type constraint for : Jsx.element to the return of the make function, via the JSX PPX. This will ensure type errors happen in the correct place, and we can probably special case those errors to include helpful information that all components need to return JSX.
Change should be to add : Jsx.element as return constraint for the make function in the JSX PPX. Example of how the output should look after having been processed by the JSX PPX:
// asyncAwait.txt let f = a => Js.Promise.resolve(a + a) module C0 = { @res.jsxComponentProps type props<'a> = {a: 'a} - let make = async ({a, _}: props<_>) => { + let make = async ({a, _}: props<_>): Jsx.element => { let a = await f(a) ReactDOM.jsx("div", {children: ?ReactDOM.someElement({React.int(a)})}) } let make = { let \"AsyncAwait$C0" = (props: props<_>) => Jsx.promise(make(props)) \"AsyncAwait$C0" } } module C1 = { @res.jsxComponentProps type props<'status> = {status: 'status} let make = async ({status, _}: props<_>) => { switch status { | #on => React.string("on") | #off => React.string("off") } } let make = { let \"AsyncAwait$C1" = (props: props<_>) => Jsx.promise(make(props)) \"AsyncAwait$C1" } }