简体   繁体   中英

How to make Nestjs Typeorm's enum and protobuf's enum compatible?

I am building a Nestjs GRPC microservice app. I got this following error when trying to pass a TaskRequest type into taskService.createTask which has an ICreateTask interface

 Types of property 'taskStatus' are incompatible.
    Type 'TaskStatus' is not assignable to type 'TaskStatusEnum'.

How can I make them compatible? I am using protobufjs package to compile proto file into ts file.

 "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 proto

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的编译接口。

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM