Imagine I have a hypothetical vehicle
:
public class Car
{
ManufacturedYear: number;
Manufacturer: string;
}
I am aiming to construct a well-defined tree of criteria that can be serialized to JSON, used on the client side for filtering, or on the server side for generating an SQL where clause. Here is my current progress:
export class FilterFactory {
private constructor() {
}
public static createFilter<TModel, TKey extends keyof TModel>(
key: TKey,
value: TModel[TKey],
): IFilterCriteria<TModel, TKey> {
return new FilterCriteria(key, value);
}
}
export interface IFilterCriteria<TModel, TKey extends keyof TModel> {
property?: TKey;
value?: TModel[TKey];
operator? : 'and' | 'or'; //tbd enum
criterias?: ??
}
class FilterCriteria<TModel, TKey extends keyof TModel>
implements IFilterCriteria<TModel, TKey>
{
public property?: TKey;
public value?: TModel[TKey];
public operator? : 'and' | 'or'; //tbd enum
public criterias?: ??
constructor() {}
}
As demonstrated below:
var noerror = FilterFactory.createFilter<Car, 'ManufacturedYear'>('ManufacturedYear', 2008);
var expectederror = FilterFactory.createFilter<Car, 'ManufacturedYear'>('ManufacturedYear', 'asdf');
The challenge lies in eliminating the need to specify the key twice, both as a generic and as a parameter. Thus, I aim to achieve one of the following:
var noerror = FilterFactory.createFilter<Car, 'ManufacturedYear'>(2008);
// or
var noerror = FilterFactory.createFilter<Car>('ManufacturedYear', 2008);