如何使Nestjs Typeorm 的enum 和protobuf 的enum 兼容?
How to make Nestjs Typeorm's enum and protobuf's enum compatible?
我正在构建一个 Nestjs GRPC 微服务应用程序。尝试将 TaskRequest
类型传递给具有 ICreateTask
接口
的 taskService.createTask
时出现以下错误
Types of property 'taskStatus' are incompatible.
Type 'TaskStatus' is not assignable to type 'TaskStatusEnum'.
如何使它们兼容?
我正在使用 protobufjs 包将 proto 文件编译成 ts 文件。
"compile": "mkdir -p src/proto && pbjs -t static-module -w commonjs -o src/proto/task.proto.js lib/proto/task.proto && pbts -o src/proto/task.proto.d.ts src/proto/task.proto.js"
GRPC 原型
task.proto
message TaskRequest {
enum TaskStatus{
DONE = 0;
ACTIVE = 1;
}
TaskStatus taskStatus = 1;
string dateCreated = 2;
string dateUpdated = 3;
}
Typeorm
task.controller
@Controller()
export class TaskController {
constructor(private taskService: taskService) {}
async createPayment(taskRequest: TaskRequest): Promise<Task> {
return this.taskService.createTask(taskRequest);
}
}
task.service.ts
@Injectable()
export class TaskRepository {
constructor(
@InjectRepository(TaskRepository)
private taskRepository: TaskRepository,
) {}
async createTask(createTaskData: ICreateTask): Promise<Task> {
const task = await this.taskRepository.createTask(
createTaskData,
);
return task;
}
}
task.entity.ts
export enum TaskStatusEnum {
DONE = 'DONE',
ACTIVE = 'ACTIVE'
}
@Entity()
export class Task extends BaseEntity {
@PrimaryGeneratedColumn('uuid')
taskId: string;
@Column({
type: 'enum',
enum: TaskStatusEnum,
})
taskStatus: TaskStatusEnum;
@Column({ type: 'timestamptz' })
dateCreated: Date;
@Column({ type: 'timestamptz' })
dateUpdated: Date;
}
task.interface.ts
export class ICreateTask {
@IsNotEmpty()
@IsIn([TaskStatusEnum.DONE, TaskStatusEnum.ACTIVE])
taskStatus: TaskStatusEnum;
@IsNotEmpty()
@IsDateString()
dateCreated: string;
@IsDateString()
dateUpdated: string;
我最终使用了 task.proto.d.ts
的编译接口。
我正在构建一个 Nestjs GRPC 微服务应用程序。尝试将 TaskRequest
类型传递给具有 ICreateTask
接口
taskService.createTask
时出现以下错误
Types of property 'taskStatus' are incompatible.
Type 'TaskStatus' is not assignable to type 'TaskStatusEnum'.
如何使它们兼容? 我正在使用 protobufjs 包将 proto 文件编译成 ts 文件。
"compile": "mkdir -p src/proto && pbjs -t static-module -w commonjs -o src/proto/task.proto.js lib/proto/task.proto && pbts -o src/proto/task.proto.d.ts src/proto/task.proto.js"
GRPC 原型
task.proto
message TaskRequest {
enum TaskStatus{
DONE = 0;
ACTIVE = 1;
}
TaskStatus taskStatus = 1;
string dateCreated = 2;
string dateUpdated = 3;
}
Typeorm
task.controller
@Controller()
export class TaskController {
constructor(private taskService: taskService) {}
async createPayment(taskRequest: TaskRequest): Promise<Task> {
return this.taskService.createTask(taskRequest);
}
}
task.service.ts
@Injectable()
export class TaskRepository {
constructor(
@InjectRepository(TaskRepository)
private taskRepository: TaskRepository,
) {}
async createTask(createTaskData: ICreateTask): Promise<Task> {
const task = await this.taskRepository.createTask(
createTaskData,
);
return task;
}
}
task.entity.ts
export enum TaskStatusEnum {
DONE = 'DONE',
ACTIVE = 'ACTIVE'
}
@Entity()
export class Task extends BaseEntity {
@PrimaryGeneratedColumn('uuid')
taskId: string;
@Column({
type: 'enum',
enum: TaskStatusEnum,
})
taskStatus: TaskStatusEnum;
@Column({ type: 'timestamptz' })
dateCreated: Date;
@Column({ type: 'timestamptz' })
dateUpdated: Date;
}
task.interface.ts
export class ICreateTask {
@IsNotEmpty()
@IsIn([TaskStatusEnum.DONE, TaskStatusEnum.ACTIVE])
taskStatus: TaskStatusEnum;
@IsNotEmpty()
@IsDateString()
dateCreated: string;
@IsDateString()
dateUpdated: string;
我最终使用了 task.proto.d.ts
的编译接口。