Совместное использование интерфейса TS между внутренним и внешним интерфейсом - PullRequest
0 голосов
/ 15 ноября 2018

Скажите, у меня есть файл экспресс-маршрутизатора:

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 голосов
/ 15 ноября 2018

Что-то вроде этого - единственное, что я могу придумать, не используя третий промежуточный файл .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{

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...