in sdk/search/search-documents/src/indexModels.ts [728:776]
Union extends unknown ? (_: Union) => unknown : never
) extends // Infer the intersection of the members of U as a single intersected parameter type
(_: infer I) => unknown
? I
: never;
// Types that should not be included in SelectFields recursion
export type ExcludedODataTypes = Date | GeographyPoint;
/**
* Produces a union of valid Cognitive Search OData $select paths for T
* using a post-order traversal of the field tree rooted at T.
*/
export type SelectFields<TModel extends object> =
// If T is never, any, or object, resolves to string
(<T>() => T extends TModel ? true : false) extends <T>() => T extends never ? true : false
? string
: (<T>() => T extends TModel ? true : false) extends <T>() => T extends any ? true : false
? string
: (<T>() => T extends TModel ? true : false) extends <T>() => T extends object ? true : false
? string
: // If T is an array, allow selecting from fields in the array's element type
TModel extends Array<infer Elem>
? // Allow selecting fields only from elements which are objects
Elem extends object
? SelectFields<Elem>
: never
: {
// Only consider string keys
[Key in keyof TModel]: Key extends string
? NonNullable<TModel[Key]> extends object
? NonNullable<TModel[Key]> extends ExcludedODataTypes
? // Excluded, so don't recur
Key
: // Extract subpaths from T[Key]
SelectFields<NonNullable<TModel[Key]>> extends infer NextPaths
? // This check is required to avoid distributing `never` over the condition
(<T>() => T extends NextPaths ? true : false) extends <
T,
>() => T extends never ? true : false
? Key
: NextPaths extends string
? Key | `${Key}/${NextPaths}`
: Key
: never
: // Not an object, so can't recur
Key
: never;
}[keyof TModel & string] &