type ValueOf = D[keyof D]; type Unpacked = D extends any[] | readonly any[] ? D[number] : D; type Nullable = D | null; type LooseObject = { [key: string]: any; }; type StrictObject = { [key: string]: T; }; type Pair = { key: string; value: T; }; interface DataWrapper { data: T; } interface AsyncDataWrapper { data: T[]; total: number; } type PromiseType = T extends Promise ? D : never; type Override = T & Omit; type Comparer = (lhs: T, rhs: T) => boolean; type KeysOfType = NonNullable< ValueOf<{ [P in keyof D]: D[P] extends T ? P : never }> >; type ItemIdType = KeysOfType;