import type {UnionToIntersection} from './union-to-intersection.d.ts'; import type {IsNever} from './is-never.d.ts'; /** Returns an arbitrary member of a union type. Use-cases: - Implementing recursive type functions that accept a union type. @example ``` import type {UnionMember, IsNever} from 'type-fest'; type UnionLength = UnionMember extends infer Member ? IsNever extends false ? UnionLength, [...Acc, Member]> : Acc['length'] : never; type T1 = UnionLength<'foo' | 'bar' | 'baz'>; //=> 3 type T2 = UnionLength<{a: string}>; //=> 1 ``` - Picking an arbitrary member from a union @example ``` import type {UnionMember, Primitive, LiteralToPrimitive} from 'type-fest'; type IsHomogenous = [T] extends [LiteralToPrimitive>] ? true : false; type T1 = IsHomogenous<1 | 2 | 3 | 4>; //=> true type T2 = IsHomogenous<'foo' | 'bar'>; //=> true type T3 = IsHomogenous<'foo' | 'bar' | 1>; //=> false ``` Returns `never` when the input is `never`. @example ``` import type {UnionMember} from 'type-fest'; type LastNever = UnionMember; //=> never ``` @category Type */ export type UnionMember = IsNever extends true ? never : UnionToIntersection T : never> extends () => (infer R) ? R : never; export {};