Поделиться через


SelectFields type

Создает объединение допустимых путей OData когнитивного поиска $select для T с помощью обхода после заказа дерева полей, корнями в T.

type SelectFields<TModel> = () => (
  T extends TModel ? true : false
) extends () => T extends never ? true : false
  ? string
  : () => (T extends TModel ? true : false) extends () => T extends any
      ? true
      : false
      ? string
      : () => (T extends TModel ? true : false) extends () => T extends object
          ? true
          : false
          ? string
          : TModel extends Elem[]
          ? Elem extends object
            ? SelectFields<Elem>
            : never
          : {
              [Key in keyof TModel]: Key extends string
                ? NonNullable<TModel[Key]> extends object
                  ? NonNullable<TModel[Key]> extends ExcludedODataTypes
                    ? Key
                    : SelectFields<NonNullable<TModel[Key]>> extends NextPaths
                    ? () => (
                        T extends NextPaths ? true : false
                      ) extends () => T extends never ? true : false
                        ? Key
                        : NextPaths extends string
                        ? Key | Object
                        : Key
                    : never
                  : Key
                : never
            }[keyof TModel & string] &
              string