# UnionMember

`type` in `services` · v0.7.1

<https://docs.seedcord.org/packages/services/0.7.1/types/union-member>

Returns an arbitrary member of a union type.

Use-cases: - Implementing recursive type functions that accept a union type.

## Examples

```ts
import type {UnionMember, IsNever} from 'type-fest';

type UnionLength<T, Acc extends any[] = []> =
	UnionMember<T> extends infer Member
		? IsNever<Member> extends false
			? UnionLength<Exclude<T, Member>, [...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
```

```ts
import type {UnionMember, Primitive, LiteralToPrimitive} from 'type-fest';

type IsHomogenous<T extends Primitive> = [T] extends [LiteralToPrimitive<UnionMember<T>>] ? 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.
```

```ts
import type {UnionMember} from 'type-fest';

type LastNever = UnionMember<never>;
//=> never

 Type
```

## Declaration

```ts
type UnionMember<T> =
    IsNever<T> extends true
        ? never
        : UnionToIntersection<
                T extends any ? () => T : never
            > extends () => infer R
          ? R
          : never;
```
