Browse Source

feat(core): use Object.Paths in byDeep method of TrackByService

pull/3320/head
Arman Ozak 7 years ago
parent
commit
007421aae1
  1. 9
      npm/ng-packs/packages/core/src/lib/services/track-by.service.ts
  2. 16
      npm/ng-packs/packages/core/src/lib/tests/track-by.service.spec.ts

9
npm/ng-packs/packages/core/src/lib/services/track-by.service.ts

@ -1,18 +1,19 @@
import { Injectable, TrackByFunction } from '@angular/core'; import { Injectable, TrackByFunction } from '@angular/core';
import { O } from 'ts-toolbelt';
@Injectable({ @Injectable({
providedIn: 'root', providedIn: 'root',
}) })
export class TrackByService<ItemType = any> { export class TrackByService<ItemType = any> {
by<T = ItemType>(key: keyof T): TrackByFunction<T> { by<T = ItemType>(key: keyof T): TrackByFunction<T> {
return ({}, item) => item[key]; return (_, item) => item[key];
} }
byDeep<T = ItemType>(...keys: (string | number)[]): TrackByFunction<T> { byDeep<T = ItemType>(...keys: T extends object ? O.Paths<T> : never): TrackByFunction<T> {
return ({}, item) => keys.reduce((acc, key) => acc[key], item); return (_, item) => keys.reduce((acc, key) => acc[key], item);
} }
bySelf<T = ItemType>(): TrackByFunction<T> { bySelf<T = ItemType>(): TrackByFunction<T> {
return ({}, item) => item; return (_, item) => item;
} }
} }

16
npm/ng-packs/packages/core/src/lib/tests/track-by.service.spec.ts

@ -11,17 +11,11 @@ describe('TrackByService', () => {
describe('#byDeep', () => { describe('#byDeep', () => {
it('should return a function which tracks a deeply-nested property', () => { it('should return a function which tracks a deeply-nested property', () => {
expect( const obj = {
service.byDeep( a: { b: { c: { x: 1036 } } },
'a', };
'b',
'c', expect(service.byDeep<typeof obj>('a', 'b', 'c', 'x')(284, obj)).toBe(1036);
1,
'x',
)(284, {
a: { b: { c: [{ x: 1035 }, { x: 1036 }, { x: 1037 }] } },
}),
).toBe(1036);
}); });
}); });

Loading…
Cancel
Save