/** * Create a union between `T` and `Union` without losing the literal type of `T`. * A common use case is when you need a function that accepts a known string literal or any string. * Using `UnionLiteral` would preserve `T` and enable intellisense for the argument. * * @example * ``` * declare function fn(arg: UnionLiteral<'a' | 'b' | 'c' | 4>): void * // valid * fn('a') * fn('b') * fn('c') * fn(4) * // invalid * //@ts-expect-error - "d" is not a valid argument * fn('d') // Error * //@ts-expect-error - '{}' is not a valid argument * fn({}) // Error * ``` */ export type UnionLiteral = T | (Union & { _?: never })