es-toolkit
es-toolkit copied to clipboard
feat(clone): enhance type and logic.
Current clone() function considers only those native classes.
DateSetMapRegExp
However, there are much more native classes in the JavaScript, especially about binary handling.
So, I think that the clone() function should consider them.
Uint8ArrayUint8ClampedArrayUint16ArrayBigInt64ArrayInt8ArrayInt16ArrayInt32ArrayBigInt64ArrayFloat32ArrayFloat64ArrayArrayBufferSharedArrayBufferDataViewBlobFile
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 issue: https://github.com/toss/es-toolkit/issues/196
- previous PR: https://github.com/toss/es-toolkit/pull/155