Sharing TS interface between back-end and front-end










0















Say I have this express router file:



import * as express from 'express';
const router = express.Router();

export const register = v =>
router.get('/', makeGetFoo(v));
router.put('/', makePutFoo(v));


const makeGetFoo = v =>

interface Response extends ApiDocResponse // <--- i want to share this interface with front-end codebase
success: true


return (req,res,next) =>

res.json(<Response>success:true);

;




As you can see I am trying to create an ApiDoc system. But it could also be useful on the front-end, so the front-end TypeScript can know what types will be de-serialized from the API server.



My question is - how can I import the types from the backend code into an Angular5 or Angular6 codebase? The only good way I know of doing this, is put the ApiDoc.Response types in a 3rd .d.ts file, and then the front-end and back-end can both import that file. The downside of this, of course, is maintaining that 3rd file, and matching it correctly to the API route file.










share|improve this question




























    0















    Say I have this express router file:



    import * as express from 'express';
    const router = express.Router();

    export const register = v =>
    router.get('/', makeGetFoo(v));
    router.put('/', makePutFoo(v));


    const makeGetFoo = v =>

    interface Response extends ApiDocResponse // <--- i want to share this interface with front-end codebase
    success: true


    return (req,res,next) =>

    res.json(<Response>success:true);

    ;




    As you can see I am trying to create an ApiDoc system. But it could also be useful on the front-end, so the front-end TypeScript can know what types will be de-serialized from the API server.



    My question is - how can I import the types from the backend code into an Angular5 or Angular6 codebase? The only good way I know of doing this, is put the ApiDoc.Response types in a 3rd .d.ts file, and then the front-end and back-end can both import that file. The downside of this, of course, is maintaining that 3rd file, and matching it correctly to the API route file.










    share|improve this question


























      0












      0








      0


      0






      Say I have this express router file:



      import * as express from 'express';
      const router = express.Router();

      export const register = v =>
      router.get('/', makeGetFoo(v));
      router.put('/', makePutFoo(v));


      const makeGetFoo = v =>

      interface Response extends ApiDocResponse // <--- i want to share this interface with front-end codebase
      success: true


      return (req,res,next) =>

      res.json(<Response>success:true);

      ;




      As you can see I am trying to create an ApiDoc system. But it could also be useful on the front-end, so the front-end TypeScript can know what types will be de-serialized from the API server.



      My question is - how can I import the types from the backend code into an Angular5 or Angular6 codebase? The only good way I know of doing this, is put the ApiDoc.Response types in a 3rd .d.ts file, and then the front-end and back-end can both import that file. The downside of this, of course, is maintaining that 3rd file, and matching it correctly to the API route file.










      share|improve this question
















      Say I have this express router file:



      import * as express from 'express';
      const router = express.Router();

      export const register = v =>
      router.get('/', makeGetFoo(v));
      router.put('/', makePutFoo(v));


      const makeGetFoo = v =>

      interface Response extends ApiDocResponse // <--- i want to share this interface with front-end codebase
      success: true


      return (req,res,next) =>

      res.json(<Response>success:true);

      ;




      As you can see I am trying to create an ApiDoc system. But it could also be useful on the front-end, so the front-end TypeScript can know what types will be de-serialized from the API server.



      My question is - how can I import the types from the backend code into an Angular5 or Angular6 codebase? The only good way I know of doing this, is put the ApiDoc.Response types in a 3rd .d.ts file, and then the front-end and back-end can both import that file. The downside of this, of course, is maintaining that 3rd file, and matching it correctly to the API route file.







      node.js typescript express angular5 angular6






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 15 '18 at 0:46







      Alexander Mills

















      asked Nov 15 '18 at 0:29









      Alexander MillsAlexander Mills

      20k35163347




      20k35163347






















          1 Answer
          1






          active

          oldest

          votes


















          0














          Something like this is the only I can think of doing it, without having to use a third intermediary file .d.ts file:



          import * as express from 'express';
          import RequestHandler from 'express';

          const router = express.Router();

          export const register = (v: any) =>
          router.get('/', MakeGet.makeGetFoo(v));
          router.put('/', MakePut.makePutFoo(v));
          ;

          interface ApiDoc
          success: boolean


          export namespace MakeGet

          export interface Response extends ApiDoc // <--- i want to share this interface with front-end codebase
          success: true


          export const makeGetFoo = (v: any): RequestHandler =>

          return (req, res, next) =>

          res.json(<Response>success: true);

          ;

          ;




          export namespace MakePut

          export interface Response extends ApiDoc // <--- i want to share this interface with front-end codebase
          success: true


          export const makePutFoo = (v:any): RequestHandler =>

          return (req,res,next) =>

          res.json(<Response>success:true);

          ;

          ;



          The downside is all the namespaces and having to name things so much.
          However if you put your routes and api-doc info here, but put controller code elsewhere, you can keep these router files sparse and clean.



          And so in another file (perhaps in your front-end code), you can this:



          import MakeGet, MakePut from './foo'

          export interface Bar extends MakePut.Response







          share|improve this answer
























            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',
            autoActivateHeartbeat: false,
            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%2f53310792%2fsharing-ts-interface-between-back-end-and-front-end%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









            0














            Something like this is the only I can think of doing it, without having to use a third intermediary file .d.ts file:



            import * as express from 'express';
            import RequestHandler from 'express';

            const router = express.Router();

            export const register = (v: any) =>
            router.get('/', MakeGet.makeGetFoo(v));
            router.put('/', MakePut.makePutFoo(v));
            ;

            interface ApiDoc
            success: boolean


            export namespace MakeGet

            export interface Response extends ApiDoc // <--- i want to share this interface with front-end codebase
            success: true


            export const makeGetFoo = (v: any): RequestHandler =>

            return (req, res, next) =>

            res.json(<Response>success: true);

            ;

            ;




            export namespace MakePut

            export interface Response extends ApiDoc // <--- i want to share this interface with front-end codebase
            success: true


            export const makePutFoo = (v:any): RequestHandler =>

            return (req,res,next) =>

            res.json(<Response>success:true);

            ;

            ;



            The downside is all the namespaces and having to name things so much.
            However if you put your routes and api-doc info here, but put controller code elsewhere, you can keep these router files sparse and clean.



            And so in another file (perhaps in your front-end code), you can this:



            import MakeGet, MakePut from './foo'

            export interface Bar extends MakePut.Response







            share|improve this answer





























              0














              Something like this is the only I can think of doing it, without having to use a third intermediary file .d.ts file:



              import * as express from 'express';
              import RequestHandler from 'express';

              const router = express.Router();

              export const register = (v: any) =>
              router.get('/', MakeGet.makeGetFoo(v));
              router.put('/', MakePut.makePutFoo(v));
              ;

              interface ApiDoc
              success: boolean


              export namespace MakeGet

              export interface Response extends ApiDoc // <--- i want to share this interface with front-end codebase
              success: true


              export const makeGetFoo = (v: any): RequestHandler =>

              return (req, res, next) =>

              res.json(<Response>success: true);

              ;

              ;




              export namespace MakePut

              export interface Response extends ApiDoc // <--- i want to share this interface with front-end codebase
              success: true


              export const makePutFoo = (v:any): RequestHandler =>

              return (req,res,next) =>

              res.json(<Response>success:true);

              ;

              ;



              The downside is all the namespaces and having to name things so much.
              However if you put your routes and api-doc info here, but put controller code elsewhere, you can keep these router files sparse and clean.



              And so in another file (perhaps in your front-end code), you can this:



              import MakeGet, MakePut from './foo'

              export interface Bar extends MakePut.Response







              share|improve this answer



























                0












                0








                0







                Something like this is the only I can think of doing it, without having to use a third intermediary file .d.ts file:



                import * as express from 'express';
                import RequestHandler from 'express';

                const router = express.Router();

                export const register = (v: any) =>
                router.get('/', MakeGet.makeGetFoo(v));
                router.put('/', MakePut.makePutFoo(v));
                ;

                interface ApiDoc
                success: boolean


                export namespace MakeGet

                export interface Response extends ApiDoc // <--- i want to share this interface with front-end codebase
                success: true


                export const makeGetFoo = (v: any): RequestHandler =>

                return (req, res, next) =>

                res.json(<Response>success: true);

                ;

                ;




                export namespace MakePut

                export interface Response extends ApiDoc // <--- i want to share this interface with front-end codebase
                success: true


                export const makePutFoo = (v:any): RequestHandler =>

                return (req,res,next) =>

                res.json(<Response>success:true);

                ;

                ;



                The downside is all the namespaces and having to name things so much.
                However if you put your routes and api-doc info here, but put controller code elsewhere, you can keep these router files sparse and clean.



                And so in another file (perhaps in your front-end code), you can this:



                import MakeGet, MakePut from './foo'

                export interface Bar extends MakePut.Response







                share|improve this answer















                Something like this is the only I can think of doing it, without having to use a third intermediary file .d.ts file:



                import * as express from 'express';
                import RequestHandler from 'express';

                const router = express.Router();

                export const register = (v: any) =>
                router.get('/', MakeGet.makeGetFoo(v));
                router.put('/', MakePut.makePutFoo(v));
                ;

                interface ApiDoc
                success: boolean


                export namespace MakeGet

                export interface Response extends ApiDoc // <--- i want to share this interface with front-end codebase
                success: true


                export const makeGetFoo = (v: any): RequestHandler =>

                return (req, res, next) =>

                res.json(<Response>success: true);

                ;

                ;




                export namespace MakePut

                export interface Response extends ApiDoc // <--- i want to share this interface with front-end codebase
                success: true


                export const makePutFoo = (v:any): RequestHandler =>

                return (req,res,next) =>

                res.json(<Response>success:true);

                ;

                ;



                The downside is all the namespaces and having to name things so much.
                However if you put your routes and api-doc info here, but put controller code elsewhere, you can keep these router files sparse and clean.



                And so in another file (perhaps in your front-end code), you can this:



                import MakeGet, MakePut from './foo'

                export interface Bar extends MakePut.Response








                share|improve this answer














                share|improve this answer



                share|improve this answer








                edited Nov 15 '18 at 22:36









                halfer

                14.7k759116




                14.7k759116










                answered Nov 15 '18 at 0:52









                Alexander MillsAlexander Mills

                20k35163347




                20k35163347





























                    draft saved

                    draft discarded
















































                    Thanks for contributing an answer to Stack Overflow!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid


                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.

                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function ()
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53310792%2fsharing-ts-interface-between-back-end-and-front-end%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

                    How to how show current date and time by default on contact form 7 in WordPress without taking input from user in datetimepicker

                    Syphilis

                    Darth Vader #20