type-plus
Version:
Provides additional types for TypeScript.
38 lines (35 loc) • 891 B
text/typescript
/**
* 🌪️ *filter*
*
* Filter the type `T` to ensure it is a union.
*
* @example
* ```ts
* type R = IsUnion<'a' | 'b'> // 'a' | 'b'
* type R = IsUnion<boolean> // boolean
* type R = IsUnion<number> // never
* ```
*/
export type UnionType<T, Then = T, Else = never> = UnionType.Device<T, Then, Else>
/**
* 🎭 *validate*
*
* Validate the type `T` is a union.
*
* @author Nurbol Alpysbayev
* @see https://stackoverflow.com/questions/53953814/typescript-check-if-a-type-is-a-union
*
* @example
* ```ts
* type R = IsUnion<'a' | 'b'> // true
* type R = IsUnion<boolean> // true
* type R = IsUnion<number> // false
* ```
*/
export type IsUnion<T, Then = true, Else = false> = UnionType.Device<T, Then, Else>
export namespace UnionType {
export type Device<T, Then, Else, U = T> =
(T extends unknown ? (U extends T ? 1 : 2) : never) extends 1
? Else
: Then
}