1

In the following code I'd like to filter according to received filters. The thing is that each of the filters can be defined or not. I'm getting a error inside the Lucid If statements because filters.status and filters.departments can be undefined. Is that a bug or is there a solution that does not involves telling Typescript to ignore the error?

In theory, the Lucid if statement checks if both filter properties exists.

export interface ISalesFilter {
  status?: number[];
  departments?: string[];
 }

async filterSales(filters: ISalesFilter {
  const filteredSales = await FilterModel.query()
     .if(filters.status, (query) => {
         query.whereIn('statusId', filters.status);
      })
     .if(filters.department, (query) => {
         query.whereIn('departmentId', filters.departments); 
     });
  return filteredSales;;
}

The following solution works, but they doesn't sound like bad practice to me:

export interface ISalesFilter {
  status?: number[];
  departments?: string[];
 }

async filterSales(filters: ISalesFilter {
  const filteredSales = await FilterModel.query()
     .if(filters.status, (query) => {
         if(filters.status){
             query.whereIn('statusId', filters.status);
         }
      })
     .if(filters.department, (query) => {
         if(filters.departments){
             query.whereIn('departmentId', filters.departments); 
         }
         
     });
  return filteredSales;;
}

Telling Typescript to ignore the problem also works, but again a fell it's not a good way of solving this:

export interface ISalesFilter {
  status?: number[];
  departments?: string[];
 }

async filterSales(filters: ISalesFilter {
  const filteredSales = await FilterModel.query()
     .if(filters.status, (query) => {
         // @ts-ignore
         query.whereIn('statusId', filters.status);
         
      })
     .if(filters.department, (query) => {
         // @ts-ignore
         query.whereIn('departmentId', filters.departments);     
         
     });
  return filteredSales;;
}
yuridamata
  • 459
  • 1
  • 5
  • 13

0 Answers0