A namespace declaration cannot be located prior to a class or function with which it is merged











up vote
3
down vote

favorite












I have react app based on react-redux-typescript-boilerplate I've created this file:



import * as React from 'react';
import { connect } from 'react-redux';

import { RootState } from 'app/reducers';

export namespace LasarTitle {
export interface Props {
title: string;
loading: boolean;
};
};

@connect(
(state: RootState): LasarTitle.Props => {
return { title: state.title, loading: state.loading };
},
() => { }
)
export class LasarTitle extends React.Component<LasarTitle.Props> {
static defaultProps: Partial<LasarTitle.Props> = {
title: ''
};
constructor(props: LasarTitle.Props, context?: any) {
super(props, context);
}
render() {
const title = this.props.loading ? 'loading...' : this.props.title;
return (
<div>
<input readOnly={true} value={title} />
</div>
);
}
}


which is exactly the same as containers/App/index.tsx it have namespace and connect on component with the same name.



What's wrong with my code? I've didn't notice any typos or errors. What's the difference between my code and boilerplate?










share|improve this question




























    up vote
    3
    down vote

    favorite












    I have react app based on react-redux-typescript-boilerplate I've created this file:



    import * as React from 'react';
    import { connect } from 'react-redux';

    import { RootState } from 'app/reducers';

    export namespace LasarTitle {
    export interface Props {
    title: string;
    loading: boolean;
    };
    };

    @connect(
    (state: RootState): LasarTitle.Props => {
    return { title: state.title, loading: state.loading };
    },
    () => { }
    )
    export class LasarTitle extends React.Component<LasarTitle.Props> {
    static defaultProps: Partial<LasarTitle.Props> = {
    title: ''
    };
    constructor(props: LasarTitle.Props, context?: any) {
    super(props, context);
    }
    render() {
    const title = this.props.loading ? 'loading...' : this.props.title;
    return (
    <div>
    <input readOnly={true} value={title} />
    </div>
    );
    }
    }


    which is exactly the same as containers/App/index.tsx it have namespace and connect on component with the same name.



    What's wrong with my code? I've didn't notice any typos or errors. What's the difference between my code and boilerplate?










    share|improve this question


























      up vote
      3
      down vote

      favorite









      up vote
      3
      down vote

      favorite











      I have react app based on react-redux-typescript-boilerplate I've created this file:



      import * as React from 'react';
      import { connect } from 'react-redux';

      import { RootState } from 'app/reducers';

      export namespace LasarTitle {
      export interface Props {
      title: string;
      loading: boolean;
      };
      };

      @connect(
      (state: RootState): LasarTitle.Props => {
      return { title: state.title, loading: state.loading };
      },
      () => { }
      )
      export class LasarTitle extends React.Component<LasarTitle.Props> {
      static defaultProps: Partial<LasarTitle.Props> = {
      title: ''
      };
      constructor(props: LasarTitle.Props, context?: any) {
      super(props, context);
      }
      render() {
      const title = this.props.loading ? 'loading...' : this.props.title;
      return (
      <div>
      <input readOnly={true} value={title} />
      </div>
      );
      }
      }


      which is exactly the same as containers/App/index.tsx it have namespace and connect on component with the same name.



      What's wrong with my code? I've didn't notice any typos or errors. What's the difference between my code and boilerplate?










      share|improve this question















      I have react app based on react-redux-typescript-boilerplate I've created this file:



      import * as React from 'react';
      import { connect } from 'react-redux';

      import { RootState } from 'app/reducers';

      export namespace LasarTitle {
      export interface Props {
      title: string;
      loading: boolean;
      };
      };

      @connect(
      (state: RootState): LasarTitle.Props => {
      return { title: state.title, loading: state.loading };
      },
      () => { }
      )
      export class LasarTitle extends React.Component<LasarTitle.Props> {
      static defaultProps: Partial<LasarTitle.Props> = {
      title: ''
      };
      constructor(props: LasarTitle.Props, context?: any) {
      super(props, context);
      }
      render() {
      const title = this.props.loading ? 'loading...' : this.props.title;
      return (
      <div>
      <input readOnly={true} value={title} />
      </div>
      );
      }
      }


      which is exactly the same as containers/App/index.tsx it have namespace and connect on component with the same name.



      What's wrong with my code? I've didn't notice any typos or errors. What's the difference between my code and boilerplate?







      reactjs typescript






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 19 at 13:32

























      asked Nov 19 at 13:02









      jcubic

      33.1k29117221




      33.1k29117221
























          1 Answer
          1






          active

          oldest

          votes

















          up vote
          2
          down vote



          accepted










          The error is pretty explicit. You just need to move the namespace declaration after the class.



          import * as React from 'react';
          import { connect } from 'react-redux';

          import { RootState } from 'app/reducers';


          @connect(
          (state: RootState): LasarTitle.Props => {
          return { title: state.title, loading: state.loading };
          },
          () => { }
          )
          export class LasarTitle extends React.Component<LasarTitle.Props> {
          static defaultProps: Partial<LasarTitle.Props> = {
          title: ''
          };
          constructor(props: LasarTitle.Props, context?: any) {
          super(props, context);
          }
          render() {
          const title = this.props.loading ? 'loading...' : this.props.title;
          return (
          <div>
          <input readOnly={true} value={title} />
          </div>
          );
          }
          }

          export namespace LasarTitle {
          export interface Props {
          title: string;
          loading: boolean;
          };
          }


          Since the namespace and the class have the same name, they will be merged. One of the things merging will do is that there will be only one object at runtime representing the combined class-namespace. For reason of implementation such a merger requires that the class object be created first and then namespace members be added to it.



          Edit



          If your namespace only contains types this rule will not be applied, if it contains code (such as function or variable declarations) the rule will apply. The boiler-plate works because it contains no code. While not obvious, your namespace does contain code, the ; at the end of the interface will be transpiled to empty JS statements, and thus the rule is enforced.



          The better solution would be to remove the ;



          import * as React from 'react';
          import { connect } from 'react-redux';

          import { RootState } from 'app/reducers';

          export namespace LasarTitle {
          export interface Props {
          title: string;
          loading: boolean;
          }
          };

          @connect(
          (state: RootState): LasarTitle.Props => {
          return { title: state.title, loading: state.loading };
          },
          () => { }
          )
          export class LasarTitle extends React.Component<LasarTitle.Props> {
          static defaultProps: Partial<LasarTitle.Props> = {
          title: ''
          };
          constructor(props: LasarTitle.Props, context?: any) {
          super(props, context);
          }
          render() {
          const title = this.props.loading ? 'loading...' : this.props.title;
          return (
          <div>
          <input readOnly={true} value={title} />
          </div>
          );
          }
          }





          share|improve this answer























          • Do you know why the example file in boilerplate is working without problem even that namespace is first? Do you see the difference between my code and boilerplate?
            – jcubic
            Nov 19 at 13:29












          • @jcubic took me a while to find the differenc, updated the answer
            – Titian Cernicova-Dragomir
            Nov 19 at 13:41








          • 1




            Wow, big props, would never be able to figure out this on my own.
            – jcubic
            Nov 19 at 13:54











          Your Answer






          StackExchange.ifUsing("editor", function () {
          StackExchange.using("externalEditor", function () {
          StackExchange.using("snippets", function () {
          StackExchange.snippets.init();
          });
          });
          }, "code-snippets");

          StackExchange.ready(function() {
          var channelOptions = {
          tags: "".split(" "),
          id: "1"
          };
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function() {
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled) {
          StackExchange.using("snippets", function() {
          createEditor();
          });
          }
          else {
          createEditor();
          }
          });

          function createEditor() {
          StackExchange.prepareEditor({
          heartbeatType: 'answer',
          convertImagesToLinks: true,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: 10,
          bindNavPrevention: true,
          postfix: "",
          imageUploader: {
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          },
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          });


          }
          });














           

          draft saved


          draft discarded


















          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53375252%2fa-namespace-declaration-cannot-be-located-prior-to-a-class-or-function-with-whic%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown

























          1 Answer
          1






          active

          oldest

          votes








          1 Answer
          1






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes








          up vote
          2
          down vote



          accepted










          The error is pretty explicit. You just need to move the namespace declaration after the class.



          import * as React from 'react';
          import { connect } from 'react-redux';

          import { RootState } from 'app/reducers';


          @connect(
          (state: RootState): LasarTitle.Props => {
          return { title: state.title, loading: state.loading };
          },
          () => { }
          )
          export class LasarTitle extends React.Component<LasarTitle.Props> {
          static defaultProps: Partial<LasarTitle.Props> = {
          title: ''
          };
          constructor(props: LasarTitle.Props, context?: any) {
          super(props, context);
          }
          render() {
          const title = this.props.loading ? 'loading...' : this.props.title;
          return (
          <div>
          <input readOnly={true} value={title} />
          </div>
          );
          }
          }

          export namespace LasarTitle {
          export interface Props {
          title: string;
          loading: boolean;
          };
          }


          Since the namespace and the class have the same name, they will be merged. One of the things merging will do is that there will be only one object at runtime representing the combined class-namespace. For reason of implementation such a merger requires that the class object be created first and then namespace members be added to it.



          Edit



          If your namespace only contains types this rule will not be applied, if it contains code (such as function or variable declarations) the rule will apply. The boiler-plate works because it contains no code. While not obvious, your namespace does contain code, the ; at the end of the interface will be transpiled to empty JS statements, and thus the rule is enforced.



          The better solution would be to remove the ;



          import * as React from 'react';
          import { connect } from 'react-redux';

          import { RootState } from 'app/reducers';

          export namespace LasarTitle {
          export interface Props {
          title: string;
          loading: boolean;
          }
          };

          @connect(
          (state: RootState): LasarTitle.Props => {
          return { title: state.title, loading: state.loading };
          },
          () => { }
          )
          export class LasarTitle extends React.Component<LasarTitle.Props> {
          static defaultProps: Partial<LasarTitle.Props> = {
          title: ''
          };
          constructor(props: LasarTitle.Props, context?: any) {
          super(props, context);
          }
          render() {
          const title = this.props.loading ? 'loading...' : this.props.title;
          return (
          <div>
          <input readOnly={true} value={title} />
          </div>
          );
          }
          }





          share|improve this answer























          • Do you know why the example file in boilerplate is working without problem even that namespace is first? Do you see the difference between my code and boilerplate?
            – jcubic
            Nov 19 at 13:29












          • @jcubic took me a while to find the differenc, updated the answer
            – Titian Cernicova-Dragomir
            Nov 19 at 13:41








          • 1




            Wow, big props, would never be able to figure out this on my own.
            – jcubic
            Nov 19 at 13:54















          up vote
          2
          down vote



          accepted










          The error is pretty explicit. You just need to move the namespace declaration after the class.



          import * as React from 'react';
          import { connect } from 'react-redux';

          import { RootState } from 'app/reducers';


          @connect(
          (state: RootState): LasarTitle.Props => {
          return { title: state.title, loading: state.loading };
          },
          () => { }
          )
          export class LasarTitle extends React.Component<LasarTitle.Props> {
          static defaultProps: Partial<LasarTitle.Props> = {
          title: ''
          };
          constructor(props: LasarTitle.Props, context?: any) {
          super(props, context);
          }
          render() {
          const title = this.props.loading ? 'loading...' : this.props.title;
          return (
          <div>
          <input readOnly={true} value={title} />
          </div>
          );
          }
          }

          export namespace LasarTitle {
          export interface Props {
          title: string;
          loading: boolean;
          };
          }


          Since the namespace and the class have the same name, they will be merged. One of the things merging will do is that there will be only one object at runtime representing the combined class-namespace. For reason of implementation such a merger requires that the class object be created first and then namespace members be added to it.



          Edit



          If your namespace only contains types this rule will not be applied, if it contains code (such as function or variable declarations) the rule will apply. The boiler-plate works because it contains no code. While not obvious, your namespace does contain code, the ; at the end of the interface will be transpiled to empty JS statements, and thus the rule is enforced.



          The better solution would be to remove the ;



          import * as React from 'react';
          import { connect } from 'react-redux';

          import { RootState } from 'app/reducers';

          export namespace LasarTitle {
          export interface Props {
          title: string;
          loading: boolean;
          }
          };

          @connect(
          (state: RootState): LasarTitle.Props => {
          return { title: state.title, loading: state.loading };
          },
          () => { }
          )
          export class LasarTitle extends React.Component<LasarTitle.Props> {
          static defaultProps: Partial<LasarTitle.Props> = {
          title: ''
          };
          constructor(props: LasarTitle.Props, context?: any) {
          super(props, context);
          }
          render() {
          const title = this.props.loading ? 'loading...' : this.props.title;
          return (
          <div>
          <input readOnly={true} value={title} />
          </div>
          );
          }
          }





          share|improve this answer























          • Do you know why the example file in boilerplate is working without problem even that namespace is first? Do you see the difference between my code and boilerplate?
            – jcubic
            Nov 19 at 13:29












          • @jcubic took me a while to find the differenc, updated the answer
            – Titian Cernicova-Dragomir
            Nov 19 at 13:41








          • 1




            Wow, big props, would never be able to figure out this on my own.
            – jcubic
            Nov 19 at 13:54













          up vote
          2
          down vote



          accepted







          up vote
          2
          down vote



          accepted






          The error is pretty explicit. You just need to move the namespace declaration after the class.



          import * as React from 'react';
          import { connect } from 'react-redux';

          import { RootState } from 'app/reducers';


          @connect(
          (state: RootState): LasarTitle.Props => {
          return { title: state.title, loading: state.loading };
          },
          () => { }
          )
          export class LasarTitle extends React.Component<LasarTitle.Props> {
          static defaultProps: Partial<LasarTitle.Props> = {
          title: ''
          };
          constructor(props: LasarTitle.Props, context?: any) {
          super(props, context);
          }
          render() {
          const title = this.props.loading ? 'loading...' : this.props.title;
          return (
          <div>
          <input readOnly={true} value={title} />
          </div>
          );
          }
          }

          export namespace LasarTitle {
          export interface Props {
          title: string;
          loading: boolean;
          };
          }


          Since the namespace and the class have the same name, they will be merged. One of the things merging will do is that there will be only one object at runtime representing the combined class-namespace. For reason of implementation such a merger requires that the class object be created first and then namespace members be added to it.



          Edit



          If your namespace only contains types this rule will not be applied, if it contains code (such as function or variable declarations) the rule will apply. The boiler-plate works because it contains no code. While not obvious, your namespace does contain code, the ; at the end of the interface will be transpiled to empty JS statements, and thus the rule is enforced.



          The better solution would be to remove the ;



          import * as React from 'react';
          import { connect } from 'react-redux';

          import { RootState } from 'app/reducers';

          export namespace LasarTitle {
          export interface Props {
          title: string;
          loading: boolean;
          }
          };

          @connect(
          (state: RootState): LasarTitle.Props => {
          return { title: state.title, loading: state.loading };
          },
          () => { }
          )
          export class LasarTitle extends React.Component<LasarTitle.Props> {
          static defaultProps: Partial<LasarTitle.Props> = {
          title: ''
          };
          constructor(props: LasarTitle.Props, context?: any) {
          super(props, context);
          }
          render() {
          const title = this.props.loading ? 'loading...' : this.props.title;
          return (
          <div>
          <input readOnly={true} value={title} />
          </div>
          );
          }
          }





          share|improve this answer














          The error is pretty explicit. You just need to move the namespace declaration after the class.



          import * as React from 'react';
          import { connect } from 'react-redux';

          import { RootState } from 'app/reducers';


          @connect(
          (state: RootState): LasarTitle.Props => {
          return { title: state.title, loading: state.loading };
          },
          () => { }
          )
          export class LasarTitle extends React.Component<LasarTitle.Props> {
          static defaultProps: Partial<LasarTitle.Props> = {
          title: ''
          };
          constructor(props: LasarTitle.Props, context?: any) {
          super(props, context);
          }
          render() {
          const title = this.props.loading ? 'loading...' : this.props.title;
          return (
          <div>
          <input readOnly={true} value={title} />
          </div>
          );
          }
          }

          export namespace LasarTitle {
          export interface Props {
          title: string;
          loading: boolean;
          };
          }


          Since the namespace and the class have the same name, they will be merged. One of the things merging will do is that there will be only one object at runtime representing the combined class-namespace. For reason of implementation such a merger requires that the class object be created first and then namespace members be added to it.



          Edit



          If your namespace only contains types this rule will not be applied, if it contains code (such as function or variable declarations) the rule will apply. The boiler-plate works because it contains no code. While not obvious, your namespace does contain code, the ; at the end of the interface will be transpiled to empty JS statements, and thus the rule is enforced.



          The better solution would be to remove the ;



          import * as React from 'react';
          import { connect } from 'react-redux';

          import { RootState } from 'app/reducers';

          export namespace LasarTitle {
          export interface Props {
          title: string;
          loading: boolean;
          }
          };

          @connect(
          (state: RootState): LasarTitle.Props => {
          return { title: state.title, loading: state.loading };
          },
          () => { }
          )
          export class LasarTitle extends React.Component<LasarTitle.Props> {
          static defaultProps: Partial<LasarTitle.Props> = {
          title: ''
          };
          constructor(props: LasarTitle.Props, context?: any) {
          super(props, context);
          }
          render() {
          const title = this.props.loading ? 'loading...' : this.props.title;
          return (
          <div>
          <input readOnly={true} value={title} />
          </div>
          );
          }
          }






          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited Nov 19 at 13:41

























          answered Nov 19 at 13:13









          Titian Cernicova-Dragomir

          52.8k33249




          52.8k33249












          • Do you know why the example file in boilerplate is working without problem even that namespace is first? Do you see the difference between my code and boilerplate?
            – jcubic
            Nov 19 at 13:29












          • @jcubic took me a while to find the differenc, updated the answer
            – Titian Cernicova-Dragomir
            Nov 19 at 13:41








          • 1




            Wow, big props, would never be able to figure out this on my own.
            – jcubic
            Nov 19 at 13:54


















          • Do you know why the example file in boilerplate is working without problem even that namespace is first? Do you see the difference between my code and boilerplate?
            – jcubic
            Nov 19 at 13:29












          • @jcubic took me a while to find the differenc, updated the answer
            – Titian Cernicova-Dragomir
            Nov 19 at 13:41








          • 1




            Wow, big props, would never be able to figure out this on my own.
            – jcubic
            Nov 19 at 13:54
















          Do you know why the example file in boilerplate is working without problem even that namespace is first? Do you see the difference between my code and boilerplate?
          – jcubic
          Nov 19 at 13:29






          Do you know why the example file in boilerplate is working without problem even that namespace is first? Do you see the difference between my code and boilerplate?
          – jcubic
          Nov 19 at 13:29














          @jcubic took me a while to find the differenc, updated the answer
          – Titian Cernicova-Dragomir
          Nov 19 at 13:41






          @jcubic took me a while to find the differenc, updated the answer
          – Titian Cernicova-Dragomir
          Nov 19 at 13:41






          1




          1




          Wow, big props, would never be able to figure out this on my own.
          – jcubic
          Nov 19 at 13:54




          Wow, big props, would never be able to figure out this on my own.
          – jcubic
          Nov 19 at 13:54


















           

          draft saved


          draft discarded



















































           


          draft saved


          draft discarded














          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53375252%2fa-namespace-declaration-cannot-be-located-prior-to-a-class-or-function-with-whic%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          Popular posts from this blog

          Wiesbaden

          Marschland

          Dieringhausen