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 { O } from 'ts-toolbelt';
@Injectable({
providedIn: 'root',
})
export class TrackByService<ItemType = any> {
by<T = ItemType>(key: keyof T): TrackByFunction<T> {
return ({}, item) => item[key];
return (_, item) => item[key];
}
byDeep<T = ItemType>(...keys: (string | number)[]): TrackByFunction<T> {
return ({}, item) => keys.reduce((acc, key) => acc[key], item);
byDeep<T = ItemType>(...keys: T extends object ? O.Paths<T> : never): TrackByFunction<T> {
return (_, item) => keys.reduce((acc, key) => acc[key], item);
}
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', () => {
it('should return a function which tracks a deeply-nested property', () => {
expect(
service.byDeep(
'a',
'b',
'c',
1,
'x',
)(284, {
a: { b: { c: [{ x: 1035 }, { x: 1036 }, { x: 1037 }] } },
}),
).toBe(1036);
const obj = {
a: { b: { c: { x: 1036 } } },
};
expect(service.byDeep<typeof obj>('a', 'b', 'c', 'x')(284, obj)).toBe(1036);
});
});

Loading…
Cancel
Save