type-plus
Version:
Provides additional types for TypeScript.
62 lines • 1.5 kB
TypeScript
import type { Brand } from '../nominal/brand.js';
/**
* This is a unique type used in the `Else` branch of `NeverType`.
*/
export type Not_Never = Brand<'not_never', symbol>;
/**
* This is a unique type used in the `Else` branch of `NotNeverType`.
*/
export type Is_Never = Brand<'is_never', symbol>;
/**
* Check if `T` is `never`.
* If it is not, returns `Not_Never`.
*
* ```ts
* type R = NeverType<never> // never
*
* type R = NeverType<1> // 'not never'
* ```
*/
export type NeverType<T, Then = T, Else = Not_Never> = [T, never] extends [never, T] ? Then : Else;
/**
* Check if `T` is not `never`.
* If it is not, returns `Is_Never`.
*
* ```ts
* type R = NotNeverType<1> // 1
*
* type R = NotNeverType<never> // 'is_never'
* ```
*/
export type NotNeverType<T, Then = T, Else = Is_Never> = NeverType<T, Else, Then>;
/**
* Is `T` `never`.
*
* ```ts
* type R = IsNever<never> // true
*
* type R = IsNever<1> // false
* ```
*/
export type IsNever<T, Then = true, Else = false> = NeverType<T, Then, Else>;
/**
* Is `T` not `never`.
*
* ```ts
* type R = IsNotNever<1> // true
*
* type R = IsNotNever<never> // false
*/
export type IsNotNever<T, Then = true, Else = false> = NeverType<T, Else, Then>;
export declare namespace NeverType {
/**
* Type options when input type is `never`.
*/
interface Options {
caseNever?: unknown;
}
interface DefaultOptions {
caseNever: never;
}
}
//# sourceMappingURL=never_type.d.ts.map