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 = { [K in keyof T as K extends X ? K : never]: T[K]; }; /** * Pick all function properties in T */ export type PickFunctions = { [ K in keyof T as Or< // Omit never keys IfNever>, // Omit non functions IfFunction, false, true> > extends true ? never : K ]: T[K]; }; /** * Pick all function properties in T */ export type PickTypes = { [ K in keyof T as Or< // Omit never keys IfNever>, // 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 = { [ K in keyof T as Or< // Omit never keys IfNever>, // Omit unknown IfUnknown, // Omit any IfAny, // Omit {} IfEmptyObject, // 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 = keyof PickFunctions; /** * @desc Returns non function keys of an object */ export type NonFunctionKeys = keyof OmitFunctions; /** * @desc Returns keys that match given type */ export type KeysOfTypes = keyof PickTypes; /** * @desc Returns keys that equals given type */ export type StrictKeysOfTypes = keyof StrictPickTypes;