0.1.6Updated a month ago
declare namespace DB {
  type Lookup<LookupOriginClass extends DB.Entity, LookupTargetClass extends DB.Entity.typeofClass, Field extends string, IsSingular extends boolean> = {
    entity: LookupTargetClass
    as: Field
    localField: keyof Entity.Clean<LookupOriginClass>
    foreignField: keyof Entity.Clean<InstanceType<LookupTargetClass>>
    filter?: DB.Filterable<InstanceType<LookupTargetClass>>
    required?: boolean
  } & (
    IsSingular extends true ? {
      isArray: false
    } : {
      isArray?: true
    }
  )

  namespace Lookup {
    type ReturnType<T extends Entity.Class, Target extends Entity.typeofClass, Field extends string, IsSingular extends boolean> = Entity.Query<T & Record<Field, IsSingular extends true ? (InstanceType<Target> | null) : InstanceType<Target>[]>>
    type Config<T extends Entity.Class, Target extends Entity.typeofClass, Field extends string, IsSingular extends boolean> = Omit<Lookup<T, Target, Field, IsSingular>, 'entity' | 'isArray' | 'as'>
  }
}