Sharing TS interface between back-end and front-end
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
add a comment |
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
add a comment |
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
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
node.js typescript express angular5 angular6
edited Nov 15 '18 at 0:46
Alexander Mills
asked Nov 15 '18 at 0:29
Alexander MillsAlexander Mills
20k35163347
20k35163347
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
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
add a comment |
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
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
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
add a comment |
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
add a comment |
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
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
edited Nov 15 '18 at 22:36
halfer
14.7k759116
14.7k759116
answered Nov 15 '18 at 0:52
Alexander MillsAlexander Mills
20k35163347
20k35163347
add a comment |
add a comment |
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.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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