Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat(clone): enhance type and logic.
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. ```typescript 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: toss#196 - related PR: toss#155
- Loading branch information