Mongodb 筛选器的泛型类型脚本类型

Mongodb 筛选器的泛型类型脚本类型,mongodb,typescript,typescript-generics,Mongodb,Typescript,Typescript Generics,我有通用存储库接口: type RecursivePartial<T> = { [P in keyof T]?: T[P] extends (infer U)[] ? RecursivePartial<U>[] : T[P] extends object ? RecursivePartial<T[P]> : T[P]; }; interface Repository<T> { all(filters?: Recur

我有通用存储库接口:

type RecursivePartial<T> = {
  [P in keyof T]?:
    T[P] extends (infer U)[] ? RecursivePartial<U>[] :
    T[P] extends object ? RecursivePartial<T[P]> :
    T[P];
};

interface Repository<T> {
  all(filters?: RecursivePartial<T>): T[] | Promise<T[]>;
  find(filters: RecursivePartial<T>): T | undefined | Promise<T | undefined>;
  create(entity: T): T | Promise<T>;
  update(entity: T, fields: RecursivePartial<T>): T | Promise<T>;
}
很好。但现在,当我拥有从MongoDB查询数据的存储库时,我需要一种既支持精确过滤又支持类似查询的类型

repository.find({ property: { $exists: true } })

另外,也许您知道如何处理Promise | T

您可以在
T[p]
基本情况中添加一个额外的联合类型:

type HigherFilter = {
    $exists?: boolean,
};

type RecursivePartial<T> = {
  [P in keyof T]?:
    T[P] extends (infer U)[] ? RecursivePartial<U>[] :
    T[P] extends object ? RecursivePartial<T[P]> :
    T[P] | HigherFilter; // <---- HERE
};
类型高级过滤器={
$exists?:布尔值,
};
类型RecursivePartial={
[P in keyof T]?:
T[P]扩展(推断U)[]?递归部分[]:
T[P]扩展对象?递归部分:
T[P]|高滤器//
type HigherFilter = {
    $exists?: boolean,
};

type RecursivePartial<T> = {
  [P in keyof T]?:
    T[P] extends (infer U)[] ? RecursivePartial<U>[] :
    T[P] extends object ? RecursivePartial<T[P]> :
    T[P] | HigherFilter; // <---- HERE
};