UNPKG

ts-gems

Version:

Valuable typing extensions for TypeScript

93 lines (84 loc) 2 kB
import { Or } from './logical.js'; import { OmitFunctions } from './omit.js'; import { IfAny, IfEmptyObject, IfFunction, IfNever, IfUnknown, } from './type-check.js'; /** * From T, pick a set of properties whose keys are in the union K, * while preserving strict type checking. */ export type StrictPick<T, X extends keyof T> = { [K in keyof T as Or< // Omit never keys IfNever<Exclude<T[K], undefined>>, // Omit X K extends X ? false : true > extends true ? never : K]: T[K]; }; /** * Pick all function properties in T */ export type PickFunctions<T> = { [K in keyof T as Or< // Omit never keys IfNever<Exclude<T[K], undefined>>, // Omit non functions IfFunction<NonNullable<T[K]>, false, true> > extends true ? never : K]: T[K]; }; /** * Pick all function properties in T */ export type PickTypes<T, X> = { [K in keyof T as Or< // Omit never keys IfNever<Exclude<T[K], undefined>>, // Omit types which not exists in X T[K] extends X ? false : X extends T[K] ? false : true > extends true ? never : K]: T[K]; }; /** * Pick all function properties in T */ export type StrictPickTypes<T, X> = { [K in keyof T as Or< // Omit never keys IfNever<Exclude<T[K], undefined>>, // Omit unknown IfUnknown<T[K]>, // Omit any IfAny<T[K]>, // Omit {} IfEmptyObject<T[K]>, // Omit types which not exists in X T[K] extends X ? false : X extends T[K] ? false : true > extends true ? never : K]: T[K]; }; /** * @desc Returns Function keys of an object */ export type FunctionKeys<T> = keyof PickFunctions<T>; /** * @desc Returns non function keys of an object */ export type NonFunctionKeys<T> = keyof OmitFunctions<T>; /** * @desc Returns keys that match given type */ export type KeysOfTypes<T, X> = keyof PickTypes<T, X>; /** * @desc Returns keys that equals given type */ export type StrictKeysOfTypes<T, X> = keyof StrictPickTypes<T, X>;