在后端和前端之间共享TS接口

时间:2018-11-15 00:29:36

标签: node.js typescript express angular5 angular6

说我有这个快速路由器文件:

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});

  };

}

如您所见,我正在尝试创建ApiDoc系统。但是它在前端也可能有用,因此前端TypeScript可以知道将从API服务器反序列化哪些类型。

我的问题是-如何将类型从后端代码导入Angular5或Angular6代码库?我知道的唯一好方法是将ApiDoc.Response类型放在第3个.d.ts文件中,然后前端和后端都可以导入该文件。当然,这样做的缺点是要维护第3个文件,并将其正确匹配到API路由文件。

1 个答案:

答案 0 :(得分:0)

这样的事情是我唯一想到的事情,而不必使用第三个中间文件.d.ts

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});

    };

  };
}

缺点是所有名称空间,必须如此命名。 但是,如果在此处放置路由和api-doc信息,但在其他地方放置控制器代码,则可以使这些路由器文件稀疏和干净。

因此在另一个文件中(也许在您的前端代码中),您可以这样做:

import {MakeGet, MakePut} from './foo'

export interface Bar extends MakePut.Response{

}