types.ts 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. /* eslint-disable @typescript-eslint/array-type */
  2. export type FunctionPropertyNames<T> = {
  3. [K in keyof T]: T[K] extends Function ? K : never
  4. }[keyof T]
  5. export type FunctionProperties<T> = Pick<T, FunctionPropertyNames<T>>
  6. export type AttributesOnly<T> = {
  7. [K in keyof T]: T[K] extends Function ? never : T[K]
  8. }
  9. export type PickWith<T, KT extends keyof T, V> = {
  10. [P in KT]: T[P] extends V ? V : never
  11. }
  12. export type PickWithOpt<T, KT extends keyof T, V> = {
  13. [P in KT]?: T[P] extends V ? V : never
  14. }
  15. // https://github.com/krzkaczor/ts-essentials Rocks!
  16. export type DeepPartial<T> = {
  17. [P in keyof T]?: T[P] extends Array<infer U>
  18. ? Array<DeepPartial<U>>
  19. : T[P] extends ReadonlyArray<infer U>
  20. ? ReadonlyArray<DeepPartial<U>>
  21. : DeepPartial<T[P]>
  22. }
  23. type Primitive = string | Function | number | boolean | symbol | undefined | null
  24. export type DeepOmitHelper<T, K extends keyof T> = {
  25. [P in K]: // extra level of indirection needed to trigger homomorhic behavior
  26. T[P] extends infer TP // distribute over unions
  27. ? TP extends Primitive
  28. ? TP // leave primitives and functions alone
  29. : TP extends any[]
  30. ? DeepOmitArray<TP, K> // Array special handling
  31. : DeepOmit<TP, K>
  32. : never
  33. }
  34. export type DeepOmit<T, K> = T extends Primitive ? T : DeepOmitHelper<T, Exclude<keyof T, K>>
  35. export type DeepOmitArray<T extends any[], K> = {
  36. [P in keyof T]: DeepOmit<T[P], K>
  37. }
  38. export type Unpacked<T> = T extends (infer U)[] ? U : T
  39. export type Awaitable<T> = T | PromiseLike<T>