ПРИМЕЧАНИЕ. Недавно я наткнулся на typeorm-entitysharer , который "может использоваться для создания клиент-серверных классов на основе одних и тех же сущностей TypeORM, что позволяет вам делиться ими".Это дает вам больше контроля над тем, что вы хотите поделиться, вы можете взглянуть на их пример.Я не решил использовать его, потому что это для меня излишне.Тем не менее, вот как я структурировал свой последний проект:
У меня есть мой фронтенд и бэкэнд в одном репозитории, но я думаю, вы могли бы разделить их, но вам все равно нужно как-то держать их рядом друг с другом.Структура файла будет выглядеть примерно так:
workspace
├─backend <- repo #1
│ ├─src
│ │ ├─shared <- shared code goes here
│ │ └─proxy.ts
│ └─tsconfig.json
└─frontend <- repo #2
├─src
│ └─proxy.ts
└─tsconfig.json
Затем в backend/tsconfig.json
вы вводите
{
...
"paths": {
"@shared/*": [ "src/shared/*" ],
}
}
, а в frontend/tsconfig.json
вы вводите
{
...
"paths": {
"@shared/*": [ "../backend/src/shared/*" ],
// if you're using TypeORM, this package has dummy decorators
"typeorm": [ "node_modules/typeorm/typeorm-model-shim.js" ]
// you can do the same for other packages, point them to dummy paths
// altirnatively you can route the shared imports through the proxy.ts
// and replace them in frontend/src/proxy.ts with dummy ones
}
}
также не забудьте npm i typeorm
в своем интерфейсе.
Пример
Допустим, у меня есть это в backend/src/shared/user.entity.ts
import { PrimaryGeneratedColumn, Column } from 'typeorm';
export class UserEntity
{
@PrimaryGeneratedColumn() id: number;
@Column() name: string;
@Column() password: string;
}
Теперь я могу использовать его где угодно, например так:
import { UserEntity } from '@shared/model/user.entity';
В бэкэнде это очевидно, а во внешнем интерфейсе @shared/model/user.entity
сопоставляется с ../backend/src/shared/model/user.entity
, а import from 'typeorm'
внутри сущности сопоставляется спустышка.