66 * found in the LICENSE file at https://angular.io/license
77 */
88
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 ) => {
1212 acc [ k ] = mapper ( k , obj [ k ] ) ;
1313
1414 return acc ;
@@ -19,24 +19,33 @@ export function mapObject<T, V>(obj: {[k: string]: T},
1919const copySymbol = Symbol ( ) ;
2020
2121// 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 {
2323 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 ;
2526 } 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 ] ) {
2735 // This is a circular dependency. Just return the cloned value.
28- return value [ copySymbol ] ;
36+ return valueCasted [ copySymbol ] as T ;
2937 }
30- if ( value [ 'toJSON' ] ) {
31- return JSON . parse ( ( value [ 'toJSON' ] as ( ) => string ) ( ) ) ;
38+
39+ if ( valueCasted [ 'toJSON' ] ) {
40+ return JSON . parse ( valueCasted [ 'toJSON' ] ( ) ) ;
3241 }
3342
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 ] ) ;
3847 }
39- value [ copySymbol ] = undefined ;
48+ valueCasted [ copySymbol ] = undefined ;
4049
4150 return copy ;
4251 } else {
0 commit comments