6
6
* found in the LICENSE file at https://angular.io/license
7
7
*/
8
8
9
- export function mapObject < T , V > ( obj : { [ k : string ] : T } ,
10
- mapper : ( k : string , v : T ) => V ) : { [ k : string ] : V } {
11
- return Object . keys ( obj ) . reduce ( ( acc : { [ k : string ] : V } , k : string ) => {
9
+ export function mapObject < T , V > ( obj : { [ k : string ] : T } ,
10
+ mapper : ( k : string , v : T ) => V ) : { [ k : string ] : V } {
11
+ return Object . keys ( obj ) . reduce ( ( acc : { [ k : string ] : V } , k : string ) => {
12
12
acc [ k ] = mapper ( k , obj [ k ] ) ;
13
13
14
14
return acc ;
@@ -19,24 +19,33 @@ export function mapObject<T, V>(obj: {[k: string]: T},
19
19
const copySymbol = Symbol ( ) ;
20
20
21
21
// tslint:disable-next-line:no-any
22
- export function deepCopy < T extends any > ( value : T ) : T {
22
+ export function deepCopy < T extends any > ( value : T ) : T {
23
23
if ( Array . isArray ( value ) ) {
24
- return value . map ( ( o : T ) => deepCopy ( o ) ) ;
24
+ // tslint:disable-next-line:no-any
25
+ return value . map ( ( o : any ) => deepCopy ( o ) ) as unknown as T ;
25
26
} else if ( value && typeof value === 'object' ) {
26
- if ( value [ copySymbol ] ) {
27
+ const valueCasted = value as {
28
+ [ copySymbol ] ?: T ,
29
+ toJSON ?: ( ) => string ,
30
+ // tslint:disable-next-line:no-any
31
+ [ key : string ] : any ,
32
+ } ;
33
+
34
+ if ( valueCasted [ copySymbol ] ) {
27
35
// This is a circular dependency. Just return the cloned value.
28
- return value [ copySymbol ] ;
36
+ return valueCasted [ copySymbol ] as T ;
29
37
}
30
- if ( value [ 'toJSON' ] ) {
31
- return JSON . parse ( ( value [ 'toJSON' ] as ( ) => string ) ( ) ) ;
38
+
39
+ if ( valueCasted [ 'toJSON' ] ) {
40
+ return JSON . parse ( valueCasted [ 'toJSON' ] ( ) ) ;
32
41
}
33
42
34
- const copy = new ( Object . getPrototypeOf ( value ) . constructor ) ( ) ;
35
- value [ copySymbol ] = copy ;
36
- for ( const key of Object . getOwnPropertyNames ( value ) ) {
37
- copy [ key ] = deepCopy ( value [ key ] ) ;
43
+ const copy = new ( Object . getPrototypeOf ( valueCasted ) . constructor ) ( ) ;
44
+ valueCasted [ copySymbol ] = copy ;
45
+ for ( const key of Object . getOwnPropertyNames ( valueCasted ) ) {
46
+ copy [ key ] = deepCopy ( valueCasted [ key ] ) ;
38
47
}
39
- value [ copySymbol ] = undefined ;
48
+ valueCasted [ copySymbol ] = undefined ;
40
49
41
50
return copy ;
42
51
} else {
0 commit comments