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
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.
Returns an arbitrary member of a union type.
Use-cases: