Skip to content

Commit b3b571e

Browse files
fix(entity): set correct return type for getSelectors signature with parent selector (#4074)
BREAKING CHANGES: Selectors returned by the `adapter.getSelectors` signature that accepts a parent selector are strongly typed. BEFORE: ```ts const { selectIds, // type: (state: object) => string[] | number[] selectEntities, // type: (state: object) => Dictionary<Book> selectAll, // type: (state: object) => Book[] selectTotal, // type: (state: object) => number } = adapter.getSelectors(selectBooksState); ``` AFTER: ```ts const { selectIds, // type: MemoizedSelector<object, string[] | number[]> selectEntities, // type: MemoizedSelector<object, Dictionary<Book>> selectAll, // type: MemoizedSelector<object, Book[]> selectTotal, // type: MemoizedSelector<object, number> } = adapter.getSelectors(selectBooksState); ```
1 parent 25f95bc commit b3b571e

File tree

2 files changed

+28
-3
lines changed

2 files changed

+28
-3
lines changed

modules/entity/src/models.ts

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import { MemoizedSelector } from '@ngrx/store';
2+
13
export type Comparer<T> = (a: T, b: T) => number;
24

35
export type IdSelectorStr<T> = (model: T) => string;
@@ -85,6 +87,25 @@ export type EntitySelectors<T, V> = {
8587
selectTotal: (state: V) => number;
8688
};
8789

90+
export type MemoizedEntitySelectors<T, V> = {
91+
selectIds: MemoizedSelector<
92+
V,
93+
string[] | number[],
94+
(entityState: EntityState<T>) => string[] | number[]
95+
>;
96+
selectEntities: MemoizedSelector<
97+
V,
98+
Dictionary<T>,
99+
(entityState: EntityState<T>) => Dictionary<T>
100+
>;
101+
selectAll: MemoizedSelector<V, T[], (entityState: EntityState<T>) => T[]>;
102+
selectTotal: MemoizedSelector<
103+
V,
104+
number,
105+
(entityState: EntityState<T>) => number
106+
>;
107+
};
108+
88109
export interface EntityAdapter<T> extends EntityStateAdapter<T> {
89110
selectId: IdSelector<T>;
90111
sortComparer: false | Comparer<T>;
@@ -93,5 +114,5 @@ export interface EntityAdapter<T> extends EntityStateAdapter<T> {
93114
getSelectors(): EntitySelectors<T, EntityState<T>>;
94115
getSelectors<V>(
95116
selectState: (state: V) => EntityState<T>
96-
): EntitySelectors<T, V>;
117+
): MemoizedEntitySelectors<T, V>;
97118
}

modules/entity/src/state_selectors.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
import { createSelector } from '@ngrx/store';
2-
import { EntityState, EntitySelectors } from './models';
2+
import {
3+
EntityState,
4+
EntitySelectors,
5+
MemoizedEntitySelectors,
6+
} from './models';
37

48
export function createSelectorsFactory<T>() {
59
function getSelectors(): EntitySelectors<T, EntityState<T>>;
610
function getSelectors<V>(
711
selectState: (state: V) => EntityState<T>
8-
): EntitySelectors<T, V>;
12+
): MemoizedEntitySelectors<T, V>;
913
function getSelectors(
1014
selectState?: (state: any) => EntityState<T>
1115
): EntitySelectors<T, any> {

0 commit comments

Comments
 (0)