// void extends unknown // never extends void // undefined extends void // never extends undefined // 结论: // 1. object、any 逃离三界之外 // 2. extends extends extends import { IsNever } from "type-fest"; /** * true -> false; false -> true * * @example * type False = Negate; // false * type True = Negate; // true */ export type Negate = T extends true ? false : true; /** * (void extends T) and (T extends void) */ export type IsVoid = void extends T ? T extends void ? true : false : false; /** * (undefined extends T) and (T extends undefined) */ export type IsUndefined = undefined extends T ? T extends undefined ? true : false : false; /** * (object extends T) and (T extends object) */ export type IsObject = object extends T ? T extends object ? true : false : false; /** * filter out `never` and `void` */ export type IsValue = IsNever extends true ? false : IsVoid extends true ? false : true;