LiteralToPrimitive: T extends number
    ? number
    : T extends bigint
        ? bigint
        : T extends string
            ? string
            : T extends boolean
                ? boolean
                : T extends symbol
                    ? symbol
                    : T extends null ? null : T extends undefined ? undefined : never

Given a literal type return the primitive type it belongs to, or never if it's not a primitive.

Use-case: Working with generic types that may be literal types.

Type Parameters

  • T
import type {LiteralToPrimitive} from 'type-fest';

// No overloads needed to get the correct return type
function plus<T extends number | bigint | string>(x: T, y: T): LiteralToPrimitive<T> {
return x + (y as any);
}

plus('a', 'b'); // string
plus(1, 2); // number
plus(1n, 2n); // bigint