From 69c613bdcfc611b61092ed438400ff37111e139a Mon Sep 17 00:00:00 2001 From: Clemens Grabmann <6975408+cgrabmann@users.noreply.github.com> Date: Thu, 29 Apr 2021 19:13:39 +0200 Subject: [PATCH] fix(akita): restrict usage of sortByOrder to valid usages in type system --- libs/akita/src/lib/queryConfig.ts | 17 +++++++++++++---- libs/akita/src/lib/selectAllOverloads.ts | 9 ++++----- libs/akita/src/lib/types.ts | 2 +- 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/libs/akita/src/lib/queryConfig.ts b/libs/akita/src/lib/queryConfig.ts index 0bedd1ea..669a2d20 100644 --- a/libs/akita/src/lib/queryConfig.ts +++ b/libs/akita/src/lib/queryConfig.ts @@ -1,13 +1,22 @@ import { Order } from './sort'; -export type SortBy = ((a: E, b: E, state?: S) => number) | keyof E; +type SortByFunction = (a: E, b: E, state?: S) => number; +type SortByKey = keyof E; +export type SortBy = SortByFunction | SortByKey; -export interface SortByOptions { - sortBy?: SortBy; +interface SortByFunctionOptions { + sortBy?: SortByFunction; + sortByOrder?: undefined; +} + +interface SortByKeyOptions { + sortBy?: SortByKey; sortByOrder?: Order; } -export interface QueryConfigOptions extends SortByOptions {} +export type SortByOptions = SortByFunctionOptions | SortByKeyOptions; + +export type QueryConfigOptions = SortByOptions; export const queryConfigKey = 'akitaQueryConfig'; diff --git a/libs/akita/src/lib/selectAllOverloads.ts b/libs/akita/src/lib/selectAllOverloads.ts index 7b92dee2..6ea6279e 100644 --- a/libs/akita/src/lib/selectAllOverloads.ts +++ b/libs/akita/src/lib/selectAllOverloads.ts @@ -1,9 +1,8 @@ import { SelectOptions } from './types'; -import { SortBy } from './queryConfig'; -import { Order } from './sort'; +import { SortByOptions } from './queryConfig'; export type SelectAllOptionsA = { asObject: true; filterBy?: SelectOptions['filterBy']; limitTo?: number; sortBy?: undefined; sortByOrder?: undefined }; -export type SelectAllOptionsB = { filterBy: SelectOptions['filterBy']; limitTo?: number; sortBy?: SortBy; sortByOrder?: Order }; +export type SelectAllOptionsB = { filterBy: SelectOptions['filterBy']; limitTo?: number; } & SortByOptions export type SelectAllOptionsC = { asObject: true; limitTo?: number; sortBy?: undefined; sortByOrder?: undefined }; -export type SelectAllOptionsD = { limitTo?: number; sortBy?: SortBy; sortByOrder?: Order }; -export type SelectAllOptionsE = { asObject: false; filterBy?: SelectOptions['filterBy']; limitTo?: number; sortBy?: SortBy; sortByOrder?: Order }; +export type SelectAllOptionsD = { limitTo?: number; } & SortByOptions +export type SelectAllOptionsE = { asObject: false; filterBy?: SelectOptions['filterBy']; limitTo?: number; } & SortByOptions diff --git a/libs/akita/src/lib/types.ts b/libs/akita/src/lib/types.ts index 77381130..3f8adc67 100644 --- a/libs/akita/src/lib/types.ts +++ b/libs/akita/src/lib/types.ts @@ -27,7 +27,7 @@ export interface MultiActiveState { active: T[]; } -export interface SelectOptions extends SortByOptions { +export type SelectOptions = SortByOptions & { asObject?: boolean; filterBy?: ((entity: E, index?: number) => boolean) | ((entity: E, index?: number) => boolean)[] | undefined; limitTo?: number;