I'm trying to figure out how to write the correct type for the Data entry so that it accepts any component with props
Example:
const A = (props: { a: number }) => <>{props.a}</>
const B = (props: { b: string }) => <>{props.b}</>
type Data = {
[id: string]: <P>(props: P) => JSX.Element | null
}
const data: Data = {
aa: (props: Parameters<typeof A>[0]) => A(props),
bb: (props: Parameters<typeof B>[0]) => B(props)
}
const Usage = () => (
<>
A: {data.aa({ a: 12 })}
B: {data.bb({ b: 'hi' })}
</>
)
Even though I've specified prop types for each component, I'm still getting this error:
TS2322: Type '(props: Parameters<typeof A>[0]) => JSX.Element' is not assignable to type '<P>(props: P) => Element | null'.
Types of parameters 'props' and 'props' are incompatible.
Type 'P' is not assignable to type '{ a: number; }'
What should I write in the Data
type so it accepts any component?
CodePudding user response:
Provided you have installed @types/react
and @types/react-dom
you will have most react types already defined.
For Function Components there is the type FunctionComponent
or FC
for short. It is also generic so you can specify the props type.
import type { FC } from 'react';
const A: FC<{ a: number }> = ({ a }) => <>{a}</>;
const B: FC<{ b: number }> = ({ b }) => <>{b}</>;
type Data = {
[id: string]: FC<any>;
};
const data: Data = {
aa: A,
bb: B,
};
const Usage = () => (
<>
A: {data.aa({ a: 12 })}
B: {data.bb({ b: 'hi' })}
</>
);