首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过工厂创建密钥/值对只允许类中的属性和相关的属性值。

通过工厂创建密钥/值对只允许类中的属性和相关的属性值。
EN

Stack Overflow用户
提问于 2019-11-19 19:12:13
回答 1查看 54关注 0票数 0

所以如果我说是car

代码语言:javascript
复制
public class Car 
{
  ManufacturedYear: number;
  Manufacturer: string;
}

我希望能够构建一个强类型的标准树(它将被序列化为json和用于过滤的用户客户端或SQL子句的服务器端)。以下是我到目前为止所拥有的:

代码语言:javascript
复制
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() {}
}

Codepen示例

因此,以下工作:

代码语言:javascript
复制
var noerror = FilterFactory.createFilter<Car, 'ManufacturedYear'>('ManufacturedYear', 2008);

var expectederror = FilterFactory.createFilter<Car, 'ManufacturedYear'>('ManufacturedYear', 'asdf');

我无法理解的是,如何消除为泛型和参数指定键的冗余。因此,我的代码将是以下代码之一:

代码语言:javascript
复制
var noerror = FilterFactory.createFilter<Car, 'ManufacturedYear'>(2008);
// or
var noerror = FilterFactory.createFilter<Car>('ManufacturedYear', 2008);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-19 21:23:23

不像我所希望的那样优雅,但它并不坏,它至少是可读的:

TLDR:

代码语言:javascript
复制
class Car {
  ManufacturedYear: number;
  Manufacturer: string;
}

const manuYearFilter = FilterFactory.with<Car>().create("ManufacturedYear", 2009);

执行情况:

代码语言:javascript
复制
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],
  ) {
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58941299

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档