@types/react
package and had problems.Definitions by:
in index.d.ts
) so they can respond.React 16 components can have multiple root elements.
const Items = ({ items }: MyProps) => items.map(item => <div key={item.id}>{item.name}</div>)
However, TypeScript will break with:
error TS2605: JSX element type 'Element[]' is not a constructor function for JSX elements.
Property 'render' is missing in type 'Element[]'.
See PR #19363
That PR has been merged, so now does this work ?
Does not work for stateless functional components: https://stackoverflow.com/questions/46709773/typescript-react-rendering-an-array-from-a-stateless-functional-component
It throws the same error with @types/[email protected]
Returning array of elements works in React 16, even from stateless functional components. The SO answer is incorrect.
I can suppress the Typescript error and have my code working if I cast my component as any
:
const Items: any = ({ items }: MyProps) => items.map(item => <div key={item.id}>{item.name}</div>)
Just leaving my reproduction repo of my SO question here for reference:
https://github.com/edorivai/ts-sfc-array
Experiencing the same problem using @types/react version 16.0.18.
As simple as ({ name }) => [ <span>Hello</span>, <span>{name}</span> ]
;
The problem is still present for 16.0.22
The problem is still present for 16.0.25
Trying to keep as much type safety as I could, I'm typing my SFC that return arrays like this atm:
const MapPage: React.StatelessComponent<Props> = (props): any => [
<div key={1}>hi</div>
];
Is this resolved yet? I am having the same issue trying to return a map of items in a SFC
No. We'll probably need to wait for https://github.com/Microsoft/TypeScript/issues/21699 which is aimed to be included in TypeScript 2.8. There are several steps which need to be implemented first: https://github.com/Microsoft/TypeScript/pull/20239#issuecomment-363372640.
Since https://github.com/Microsoft/TypeScript/pull/20239#issuecomment-363372640 has been closed now, do we still have to wait for Microsoft/TypeScript#21699 to get this fixed?
I was able to resolve this by returning my map of items inside a fragment. It's not ideal, but it works.
To workaround the issue in the meantime I was able to suppress the error by casting the component to any
.
In the provided example it would look like this.
const Items: any = ({ items }: MyProps) => items.map(item => <div key={item.id}>{item.name}</div>)
Like other provided workarounds, it's not 100% ideal but it does resolve the issue.
(https://github.com/DefinitelyTyped/DefinitelyTyped/issues/20356#issuecomment-435708501)
as a workaround without :any
function getSingleElement(): JSX.Element {
return <>{itemsInArray}</>;
}
This is essentially a duplicate of #18912. Once Microsoft/TypeScript#21699 is resolved we should be able to use ReactNode
as a valid return type for function components which includes string
and boolean
.
Most helpful comment
(https://github.com/DefinitelyTyped/DefinitelyTyped/issues/20356#issuecomment-435708501)
as a workaround without :any