说我有这个快速路由器文件:
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路由文件。
答案 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{
}