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