首页 > 解决方案 > 使用单独的存储库在前端和后端之间共享类型

问题描述

我需要一些帮助。

我的项目分为 3 个存储库 - 后端、前端和具有通用类型和实用程序的存储库(以下简称 - 助手)。

前端具有以下访问服务器的代码:

export type SignInData = {
  login: string;
  password: string;
}

export class AuthService extends BaseService {
  signIn(data: SignInData): Promise<TokenString> {
    return this.post('sign-in', data);
  }
}

在后端有处理此调用的代码:

import { IsNotEmpty } from 'class-validator';

export class SignInDto {
  @IsNotEmpty()
  login: string;

  @IsNotEmpty()
  password: string;
}

基本上我可以使用一种类型,我正在考虑将服务器类提取到帮助程序中,它会是这样的:

// helper

import { IsNotEmpty } from 'class-validator';

export class SignInDto {
  @IsNotEmpty()
  login: string;

  @IsNotEmpty()
  password: string;
}

// client
import { SignInDto } from 'helper';

export class AuthService extends BaseService {
  signIn(data: SignInDto): Promise<TokenString> {
    return this.post('sign-in', data);
  }
}

new AuthService().signIn({ login: 'log', password: 'pass' })

// server
import { SignInDto } from 'helper';

// use inside controller

但是这样一来,服务器验证被提取到了助手中,从架构的角度来看,我并不喜欢。

这是另一种选择:

// helper

export interface ISignInDto {
  login: string;
  password: string;
}

// client
import { ISignInDto } from 'helper';

export class AuthService extends BaseService {
  signIn(data: ISignInDto): Promise<TokenString> {
    return this.post('sign-in', data);
  }
}

new AuthService().signIn({ login: 'log', password: 'pass' });

// server
import { ISignInDto } from 'helper';

export class SignInDto implements ISignInDto {
  @IsNotEmpty()
  login: string;

  @IsNotEmpty()
  password: string;

  remember: boolean; // here is no error, cuz class implements interface correctly
}

// use inside controller

但是这样一来,如果我想在服务器类中更改某些内容而忘记在帮助程序中进行更改,则会导致错误。

有任何想法吗?

具有不同存储库的后端和前端之间的共享类型

标签: typescriptooparchitecture

解决方案


推荐阅读