所以如果我说是car
public class Car
{
ManufacturedYear: number;
Manufacturer: string;
}我希望能够构建一个强类型的标准树(它将被序列化为json和用于过滤的用户客户端或SQL子句的服务器端)。以下是我到目前为止所拥有的:
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() {}
}因此,以下工作:
var noerror = FilterFactory.createFilter<Car, 'ManufacturedYear'>('ManufacturedYear', 2008);
var expectederror = FilterFactory.createFilter<Car, 'ManufacturedYear'>('ManufacturedYear', 'asdf');我无法理解的是,如何消除为泛型和参数指定键的冗余。因此,我的代码将是以下代码之一:
var noerror = FilterFactory.createFilter<Car, 'ManufacturedYear'>(2008);
// or
var noerror = FilterFactory.createFilter<Car>('ManufacturedYear', 2008);发布于 2019-11-19 21:23:23
不像我所希望的那样优雅,但它并不坏,它至少是可读的:
TLDR:
class Car {
ManufacturedYear: number;
Manufacturer: string;
}
const manuYearFilter = FilterFactory.with<Car>().create("ManufacturedYear", 2009);执行情况:
export interface IFilter {
}
export class FilterFactory<TModel> {
private constructor() {
}
public create<TKey extends keyof TModel>(
key: TKey,
value: TModel[TKey],
): IFilter {
return new Filter(key, value);
}
public static with<TModel>() {
return new FilterFactory<TModel>();
}
}
class Filter<TModel, TKey extends keyof TModel>
implements IFilter
{
constructor(
public property: TKey,
public value: TModel[TKey],
) {
}
}https://stackoverflow.com/questions/58941299
复制相似问题