omit.ts 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. export type Omit<T, K> = 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>(obj: T, keysToOmit: string[], recursive: boolean): T;
  8. export function omit<T extends any, K extends keyof T>(obj: T, keysToOmit: string[], recursive: boolean = false): T {
  9. if ((recursive && !isObject(obj)) || isFileObject(obj)) {
  10. return obj;
  11. }
  12. if (recursive && Array.isArray(obj)) {
  13. return obj.map((item: any) => omit(item, keysToOmit, true));
  14. }
  15. return Object.keys(obj).reduce((output: any, key) => {
  16. if (keysToOmit.includes(key)) {
  17. return output;
  18. }
  19. if (recursive) {
  20. return {...output, [key]: omit((obj as any)[key], keysToOmit, true)};
  21. }
  22. return {...output, [key]: (obj as any)[key]};
  23. }, {} as Omit<T, K>);
  24. }
  25. function isObject(input: any): input is object {
  26. return typeof input === 'object' && input !== null;
  27. }
  28. /**
  29. * When running in the Node environment, there is no native File object.
  30. */
  31. function isFileObject(input): boolean {
  32. if (typeof File === 'undefined') {
  33. return false;
  34. } else {
  35. return input instanceof File;
  36. }
  37. }