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;
I ended up using the compiled interface from
task.proto.d.ts
.