es-toolkit icon indicating copy to clipboard operation
es-toolkit copied to clipboard

Suggest to enhance `clone()` function.

Open samchon opened this issue 1 year ago • 2 comments

Current clone() function considers only those native classes.

  • Date
  • Set
  • Map
  • RegExp

However, there are much more native classes in the JavaScript, especially about binary handling.

So, I think that the clone() function should consider them.

  • Uint8Array
  • Uint8ClampedArray
  • Uint16Array
  • BigInt64Array
  • Int8Array
  • Int16Array
  • Int32Array
  • BigInt64Array
  • Float32Array
  • Float64Array
  • ArrayBuffer
  • SharedArrayBuffer
  • DataView
  • Blob
  • File

Also, current clone() function is returning the same T type with its parameter, but it is not correct.

The returned type must be casted, because non-native classes are converted to primitve object type.

To solve this problem, the clone() function needs to return Shallowed<T> type like below.

type Shallowed<T> = Equal<T, ShallowMain<T>> extends true ? T : ShallowMain<T>
type ShallowMain<T> = T extends [never]
  ? never
  : T extends object
  ? T extends 
    | Array<any> | Set<any> | Map<any, any> | Date | RegExp | Date
    | Uint8Array
    | Uint8ClampedArray
    | Uint16Array
    | Uint32Array
    | BigUint64Array
    | Int8Array
    | Int16Array
    | Int32Array
    | BigInt64Array
    | Float32Array
    | Float64Array
    | ArrayBuffer
    | SharedArrayBuffer
    | DataView
    | Blob
    | File
  ? T
  : {
    [P in keyof T]: T[P] extends Function ? never : T[P];
  }
  : T;
type Equal<X, Y> = X extends Y ? (Y extends X ? true : false) : false;

Related PR: https://github.com/toss/es-toolkit/pull/155

samchon avatar Jul 14 '24 12:07 samchon