Skip to content

Commit

Permalink
fix(entity): set correct return type for getSelectors signature with …
Browse files Browse the repository at this point in the history
…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);
```
  • Loading branch information
markostanimirovic committed Oct 19, 2023
1 parent 25f95bc commit b3b571e
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 3 deletions.
23 changes: 22 additions & 1 deletion modules/entity/src/models.ts
@@ -1,3 +1,5 @@
import { MemoizedSelector } from '@ngrx/store';

export type Comparer<T> = (a: T, b: T) => number;

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

export type MemoizedEntitySelectors<T, V> = {
selectIds: MemoizedSelector<
V,
string[] | number[],
(entityState: EntityState<T>) => string[] | number[]
>;
selectEntities: MemoizedSelector<
V,
Dictionary<T>,
(entityState: EntityState<T>) => Dictionary<T>
>;
selectAll: MemoizedSelector<V, T[], (entityState: EntityState<T>) => T[]>;
selectTotal: MemoizedSelector<
V,
number,
(entityState: EntityState<T>) => number
>;
};

export interface EntityAdapter<T> extends EntityStateAdapter<T> {
selectId: IdSelector<T>;
sortComparer: false | Comparer<T>;
Expand All @@ -93,5 +114,5 @@ export interface EntityAdapter<T> extends EntityStateAdapter<T> {
getSelectors(): EntitySelectors<T, EntityState<T>>;
getSelectors<V>(
selectState: (state: V) => EntityState<T>
): EntitySelectors<T, V>;
): MemoizedEntitySelectors<T, V>;
}
8 changes: 6 additions & 2 deletions modules/entity/src/state_selectors.ts
@@ -1,11 +1,15 @@
import { createSelector } from '@ngrx/store';
import { EntityState, EntitySelectors } from './models';
import {
EntityState,
EntitySelectors,
MemoizedEntitySelectors,
} from './models';

export function createSelectorsFactory<T>() {
function getSelectors(): EntitySelectors<T, EntityState<T>>;
function getSelectors<V>(
selectState: (state: V) => EntityState<T>
): EntitySelectors<T, V>;
): MemoizedEntitySelectors<T, V>;
function getSelectors(
selectState?: (state: any) => EntityState<T>
): EntitySelectors<T, any> {
Expand Down

0 comments on commit b3b571e

Please sign in to comment.