【问题标题】:Is there a better way to type check my search by keyword query有没有更好的方法通过关键字查询来输入检查我的搜索
【发布时间】:2022-12-04 06:25:35
【问题描述】:

我的 query 和 queryStr 类型似乎过多,它们工作得很好,我只是想知道是否可以简化它们。这些类型来自我的产品模型(ProductDoc),可以改用泛型吗?我尝试了一些组合,但没有一个有意义,请让我知道使用泛型是否更好,或者当前类型是否是最佳方法。

export class ApiFeatures {
  query: Query<
    (ProductDoc & { _id: Types.ObjectId })[],
    ProductDoc & { _id: Types.ObjectId },
    {},
    ProductDoc
  >;
  queryStr: ParsedQs;

  constructor(
    query: Query<
      (ProductDoc & { _id: Types.ObjectId })[],
      ProductDoc & { _id: Types.ObjectId },
      {},
      ProductDoc
    >,
    queryStr: ParsedQs
  ) {
    this.query = query;
    this.queryStr = queryStr;
  }

  search() {
    const keyword = this.queryStr.keyword
      ? {
          title: {
            $regex: this.queryStr?.keyword,
            $options: "i",
          },
        }
      : {};

    this.query = this.query.find({ ...keyword });
    return this;
  }
}

【问题讨论】:

    标签: typescript


    【解决方案1】:

    如果没有看到 Query&lt;&gt; 类型的实现,就不可能完全回答这个问题,但是关于你是否应该使用泛型 - Query&lt;&gt; 类型是已经一个通用的。但是,您可以通过创建一个使用 _id 字段扩展 ProductDoc 的新类型,在使用它的地方简化 ProductDoc &amp; { _id: Types.ObjectId }

    interface ProductDocWithId extends ProductDoc {
      _id: Types.ObjectId;
    }
    
    export class ApiFeatures {
      query: Query<ProductDocWithId[], ProductDocWithId, {}, ProductDoc>;
      queryStr: ParsedQs;
    
      // implementation
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多