omit.ts 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  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)) as T;
  22. }
  23. return Object.keys(obj as object).reduce((output: any, key) => {
  24. if (keysToOmit.includes(key)) {
  25. return output;
  26. }
  27. if (recursive) {
  28. return { ...output, [key]: omit((obj as any)[key], keysToOmit, true) };
  29. }
  30. return { ...output, [key]: (obj as any)[key] };
  31. }, {} as Omit<T, K>);
  32. }
  33. function isObject(input: any): input is object {
  34. return typeof input === 'object' && input !== null;
  35. }
  36. /**
  37. * When running in the Node environment, there is no native File object.
  38. */
  39. function isFileObject(input: any): boolean {
  40. if (typeof File === 'undefined') {
  41. return false;
  42. } else {
  43. return input instanceof File;
  44. }
  45. }