Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Typescript + React/Redux: Property "XXX" does not exist on type 'IntrinsicAttributes & IntrinsicClassAttributes

I'm working on a project with Typescript, React and Redux (all running in Electron), and I've run into a problem when I'm including one class based component in another and trying to pass parameters between them. Loosely speaking, I've got the following structure for the container component:

class ContainerComponent extends React.Component<any,any> {   ..   render() {     const { propToPass } = this.props;     ...     <ChildComponent propToPass={propToPass} />     ...   } }  .... export default connect(mapStateToProps, mapDispatchToProps)(ContainerComponent); 

And the child component:

interface IChildComponentProps extends React.Props<any> {   propToPass: any }  class ChildComponent extends React.Component<IChildComponentProps, any> {   ... }  .... export default connect(mapStateToProps, mapDispatchToProps)(ChildComponent); 

Obviously I'm only including the basics and there is much more to both of these classes but I'm still getting an error when I try and run what looks to me like valid code. The exact error that I'm getting:

TS2339: Property 'propToPass' does not exist on type 'IntrinsicAttributes & IntrinsicClassAttributes<Component<{}, ComponentState>> & Readonly<{ childr...'. 

When I first encountered the error I thought it was because I wasn't passing in an interface defining my props, but I created that (as you can see above) and it still doesn't work. I'm wondering, is there something I'm missing?

When I exclude the ChildComponent prop from the code in the ContainerComponent, it renders just fine (aside from my ChildComponent not having a critical prop) but with it in the JSX Typescript refuses to compile it. I think it might have something to do with the connect wrapping based on this article, but the problems in that article occurred in the index.tsx file and were a problem with the provider, and I'm getting my problems elsewhere.

like image 831
Protagonist Avatar asked Mar 07 '17 20:03

Protagonist


People also ask

What is IntrinsicAttributes?

IntrinsicAttributes interface can be used to specify extra properties used by the JSX framework which are not generally used by the components' props or arguments - for instance key in React. Specializing further, the generic JSX.

Is missing the following properties from type?

The error "Type is missing the following properties from type" occurs when the type we assign to a variable is missing some of the properties the actual type of the variable expects. To solve the error, make sure to specify all of the required properties on the object.


1 Answers

So after reading through some related answers (specifically this one and this one and looking at @basarat's answer to the question, I managed to find something that works for me. It looks (to my relatively new React eyes) like Connect was not supplying an explicit interface to the container component, so it was confused by the prop that it was trying to pass.

So the container component stayed the same, but the child component changed a bit:

interface IChildComponentProps extends React.Props<any> {   ... (other props needed by component) }  interface PassedProps extends React.Props<any> {   propToPass: any }  class ChildComponent extends React.Component<IChildComponentProps & PassedProps, any> {   ... }  .... export default connect<{}, {}, PassedProps>(mapStateToProps, mapDispatchToProps)    (ChildComponent); 

The above managed to work for me. Passing explicitly the props that the component is expecting from the container seemed to work and both components rendered properly.

NOTE: I know this is a very simplistic answer and I'm not exactly sure WHY this works, so if a more experienced React ninja wants to drop some knowledge on this answer I'd be happy to amend it.

like image 191
Protagonist Avatar answered Oct 04 '22 09:10

Protagonist