Browse Source

Merge pull request #3320 from abpframework/feature/type-safe-track-by-deep

Type-safe byDeep method in TrackByService
pull/3326/head
Mehmet Erim 7 years ago
committed by GitHub
parent
commit
eea3a5ee90
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 1
      npm/ng-packs/package.json
  2. 19
      npm/ng-packs/packages/core/src/lib/services/track-by.service.ts
  3. 20
      npm/ng-packs/packages/core/src/lib/tests/track-by.service.spec.ts
  4. 5
      npm/ng-packs/yarn.lock

1
npm/ng-packs/package.json

@ -83,6 +83,7 @@
"snq": "^1.0.3", "snq": "^1.0.3",
"symlink-manager": "^1.4.2", "symlink-manager": "^1.4.2",
"ts-node": "~7.0.0", "ts-node": "~7.0.0",
"ts-toolbelt": "^6.3.6",
"tsickle": "^0.37.0", "tsickle": "^0.37.0",
"tslint": "~5.20.0", "tslint": "~5.20.0",
"typescript": "~3.5.3", "typescript": "~3.5.3",

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

@ -1,18 +1,17 @@
import { Injectable, TrackByFunction } from '@angular/core'; import { Injectable, TrackByFunction } from '@angular/core';
import { O } from 'ts-toolbelt';
export const trackBy = <T = any>(key: keyof T): TrackByFunction<T> => (_, item) => item[key];
export const trackByDeep = <T = any>(
...keys: T extends object ? O.Paths<T> : never
): TrackByFunction<T> => (_, item) => keys.reduce((acc, key) => acc[key], item);
@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 = trackBy;
return ({}, item) => item[key];
}
byDeep<T = ItemType>(...keys: (string | number)[]): TrackByFunction<T> {
return ({}, item) => keys.reduce((acc, key) => acc[key], item);
}
bySelf<T = ItemType>(): TrackByFunction<T> { byDeep = trackByDeep;
return ({}, item) => item;
}
} }

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

@ -11,23 +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',
1,
'x',
)(284, {
a: { b: { c: [{ x: 1035 }, { x: 1036 }, { x: 1037 }] } },
}),
).toBe(1036);
});
});
describe('#bySelf', () => { expect(service.byDeep<typeof obj>('a', 'b', 'c', 'x')(284, obj)).toBe(1036);
it('should return a function which tracks the item', () => {
expect(service.bySelf()(284, 'X')).toBe('X');
}); });
}); });
}); });

5
npm/ng-packs/yarn.lock

@ -11685,6 +11685,11 @@ ts-node@~7.0.0:
source-map-support "^0.5.6" source-map-support "^0.5.6"
yn "^2.0.0" yn "^2.0.0"
ts-toolbelt@^6.3.6:
version "6.3.6"
resolved "https://registry.yarnpkg.com/ts-toolbelt/-/ts-toolbelt-6.3.6.tgz#2bde29106c013ed520c32f30e1248daf8fd4f5f9"
integrity sha512-eVzym+LyQodOCfyVyQDQ6FGYbO2Xf9Nc4dGLRKlKSUpAs+8qQWHG+grDiA3ciEuNPNZ0qJnNIYkdqBW1rCWuUA==
tsickle@^0.37.0: tsickle@^0.37.0:
version "0.37.1" version "0.37.1"
resolved "https://registry.yarnpkg.com/tsickle/-/tsickle-0.37.1.tgz#2f8a87c1b15766e866457bd06fb6c0e0d84eed09" resolved "https://registry.yarnpkg.com/tsickle/-/tsickle-0.37.1.tgz#2f8a87c1b15766e866457bd06fb6c0e0d84eed09"

Loading…
Cancel
Save