omit.ts 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. export type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;
  2. declare const File: any;
  3. /**
  4. * Type-safe omit function - returns a new object which omits the specified keys.
  5. */
  6. export function omit<T extends object, K extends keyof T>(obj: T, keysToOmit: K[]): Omit<T, K>;
  7. export function omit<T extends object | any[], K extends keyof T>(
  8. obj: T,
  9. keysToOmit: string[],
  10. recursive: boolean,
  11. ): T;
  12. export function omit<T extends any, K extends keyof T>(
  13. obj: T,
  14. keysToOmit: string[],
  15. recursive: boolean = false,
  16. ): T {
  17. if ((recursive && !isObject(obj)) || isFileObject(obj)) {
  18. return obj;
  19. }
  20. if (recursive && Array.isArray(obj)) {
  21. return obj.map((item: any) => omit(item, keysToOmit, true));
  22. }
  23. return Object.keys(obj).reduce(
  24. (output: any, key) => {
  25. if (keysToOmit.includes(key)) {
  26. return output;
  27. }
  28. if (recursive) {
  29. return { ...output, [key]: omit((obj as any)[key], keysToOmit, true) };
  30. }
  31. return { ...output, [key]: (obj as any)[key] };
  32. },
  33. {} as Omit<T, K>,
  34. );
  35. }
  36. function isObject(input: any): input is object {
  37. return typeof input === 'object' && input !== null;
  38. }
  39. /**
  40. * When running in the Node environment, there is no native File object.
  41. */
  42. function isFileObject(input): boolean {
  43. if (typeof File === 'undefined') {
  44. return false;
  45. } else {
  46. return input instanceof File;
  47. }
  48. }