import type { AbstractControl } from '@angular/forms'; import type { Observable } from 'rxjs'; /** * @alias ValuesOrBoolean * * Тип, описывающий объект-конфигуратор запроса к серверу GraphQL для данных типа T. * Данный обьект будет использоваться в качестве источника информации о требуемых данных при генерации строки-запроса. * Сервер вернет данные только для полей, присутсвующих в этом обьекте, с сохранением структуры по всем уровням вложенности. * В качестве ключей (K) необходимо указать ключи из типа T, данные для которых необходимо получить. * Ключи, значения которых являются любыми развновидностями Observable или AbstractControl (все виды реактивных форм Ангуляр) - не принимаются. * Структура возвращаемых данных будет соответствовать структуре, переданной в данном объекте, а не типе Т. * То есть, даже если некие ключи-свойства в типе T указаны как обязательные, их все равно можно не указывать в данном обьекте, но и в возвращаемых API данных эти данные будут отсутствовать. * В качестве значений: * 1. true или T[K] - в случае, если T[K] принадлежит примитивным типам, undefined или null. * 2. Если значение T[K] - "сложный" тип обьекта (НО НЕ МАССИВ!) - вложенный объект, формируемый по аналогичной схеме. * 3. Если значение T[K] - массив элементов некоего типа U - вложенный обьект, формируемый для типа U по аналогичной схеме. */ export type ValuesOrBoolean = { [K in keyof T]+?: true | (T[K] extends Observable | AbstractControl ? never : T[K] extends string | number | bigint | symbol | boolean | undefined | null ? true : T[K] extends Array | undefined | null ? ValuesOrBoolean : ValuesOrBoolean); };