diff --git a/npm/ng-packs/packages/core/src/lib/services/track-by.service.ts b/npm/ng-packs/packages/core/src/lib/services/track-by.service.ts index ca2b92db5f..4f7cc6f7c8 100644 --- a/npm/ng-packs/packages/core/src/lib/services/track-by.service.ts +++ b/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 { by(key: keyof T): TrackByFunction { - return ({}, item) => item[key]; + return (_, item) => item[key]; } - byDeep(...keys: (string | number)[]): TrackByFunction { - return ({}, item) => keys.reduce((acc, key) => acc[key], item); + byDeep(...keys: T extends object ? O.Paths : never): TrackByFunction { + return (_, item) => keys.reduce((acc, key) => acc[key], item); } bySelf(): TrackByFunction { - return ({}, item) => item; + return (_, item) => item; } } diff --git a/npm/ng-packs/packages/core/src/lib/tests/track-by.service.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/track-by.service.spec.ts index 19868e8ad5..c1125d2930 100644 --- a/npm/ng-packs/packages/core/src/lib/tests/track-by.service.spec.ts +++ b/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('a', 'b', 'c', 'x')(284, obj)).toBe(1036); }); });