From 1d28365a5acea02609ac6d197e3022717b6e29bf Mon Sep 17 00:00:00 2001 From: Matt Tingen Date: Sat, 8 Jun 2019 16:01:26 -0400 Subject: [PATCH 1/2] Improve actions type If they need to be expanded, the `ActionsFunction` overloads can be generated with the following code: ```js function buildActionsFactoryOverloads(numParams) { const overloads = []; for (let n = 0; n < numParams; n++) { const handlerParams = []; for (let i = 1; i <= n + 1; i++) { handlerParams.push(`handler${i}: T`); } overloads.push( `(${handlerParams.join( ', ', )}, options?: ActionOptions): ActionsMap;`, ); } return overloads.join('\n'); } console.log(buildActionsFactoryOverloads(10)); ``` --- addons/actions/src/models/ActionsFunction.ts | 85 ++++++++++++++++++++ addons/actions/src/models/ActionsMap.ts | 4 +- addons/actions/src/models/index.ts | 1 + addons/actions/src/preview/actions.ts | 6 +- 4 files changed, 90 insertions(+), 6 deletions(-) create mode 100644 addons/actions/src/models/ActionsFunction.ts diff --git a/addons/actions/src/models/ActionsFunction.ts b/addons/actions/src/models/ActionsFunction.ts new file mode 100644 index 000000000000..6a096f97fee9 --- /dev/null +++ b/addons/actions/src/models/ActionsFunction.ts @@ -0,0 +1,85 @@ +import { ActionOptions } from './ActionOptions'; +import { ActionsMap } from './ActionsMap'; +import { HandlerFunction } from './HandlerFunction'; + +export interface ActionsFunction { + (handlerMap: Record, options?: ActionOptions): ActionsMap; + (...handlers: T[]): ActionsMap; + + (handler1: T, options?: ActionOptions): ActionsMap; + (handler1: T, handler2: T, options?: ActionOptions): ActionsMap; + (handler1: T, handler2: T, handler3: T, options?: ActionOptions): Record< + T, + HandlerFunction + >; + ( + handler1: T, + handler2: T, + handler3: T, + handler4: T, + options?: ActionOptions + ): ActionsMap; + ( + handler1: T, + handler2: T, + handler3: T, + handler4: T, + handler5: T, + options?: ActionOptions + ): ActionsMap; + ( + handler1: T, + handler2: T, + handler3: T, + handler4: T, + handler5: T, + handler6: T, + options?: ActionOptions + ): ActionsMap; + ( + handler1: T, + handler2: T, + handler3: T, + handler4: T, + handler5: T, + handler6: T, + handler7: T, + options?: ActionOptions + ): ActionsMap; + ( + handler1: T, + handler2: T, + handler3: T, + handler4: T, + handler5: T, + handler6: T, + handler7: T, + handler8: T, + options?: ActionOptions + ): ActionsMap; + ( + handler1: T, + handler2: T, + handler3: T, + handler4: T, + handler5: T, + handler6: T, + handler7: T, + handler8: T, + handler9: T, + options?: ActionOptions + ): ActionsMap; + ( + handler1: T, + handler2: T, + handler3: T, + handler4: T, + handler5: T, + handler6: T, + handler7: T, + handler8: T, + handler9: T, + handler10: T, + options?: ActionOptions + ): ActionsMap; +} diff --git a/addons/actions/src/models/ActionsMap.ts b/addons/actions/src/models/ActionsMap.ts index d7d1b6f05a37..7dde0c7c0ddd 100644 --- a/addons/actions/src/models/ActionsMap.ts +++ b/addons/actions/src/models/ActionsMap.ts @@ -1,5 +1,3 @@ import { HandlerFunction } from './HandlerFunction'; -export interface ActionsMap { - [key: string]: HandlerFunction; -} +export type ActionsMap = Record; diff --git a/addons/actions/src/models/index.ts b/addons/actions/src/models/index.ts index eb72774241b1..d8c7de6271d0 100644 --- a/addons/actions/src/models/index.ts +++ b/addons/actions/src/models/index.ts @@ -1,4 +1,5 @@ export * from './ActionDisplay'; +export * from './ActionsFunction'; export * from './ActionOptions'; export * from './ActionsMap'; export * from './DecoratorFunction'; diff --git a/addons/actions/src/preview/actions.ts b/addons/actions/src/preview/actions.ts index 416440a66cee..41c6d077a6a4 100644 --- a/addons/actions/src/preview/actions.ts +++ b/addons/actions/src/preview/actions.ts @@ -1,8 +1,8 @@ import { action } from './action'; -import { ActionOptions, ActionsMap } from '../models'; +import { ActionsFunction, ActionOptions, ActionsMap } from '../models'; import { config } from './configureActions'; -export function actions(...args: any[]): ActionsMap { +export const actions: ActionsFunction = (...args: any[]) => { let options: ActionOptions = config; const names = args; // last argument can be options @@ -26,4 +26,4 @@ export function actions(...args: any[]): ActionsMap { actionsObject[name] = action(namesObject[name], options); }); return actionsObject; -} +}; From bdb8f74573d167c6e2cde9c2d70125ab2a8750db Mon Sep 17 00:00:00 2001 From: Matt Tingen Date: Tue, 2 Jul 2019 11:13:55 -0400 Subject: [PATCH 2/2] Use consistent return type --- addons/actions/src/models/ActionsFunction.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/addons/actions/src/models/ActionsFunction.ts b/addons/actions/src/models/ActionsFunction.ts index 6a096f97fee9..8c870cdf5ad1 100644 --- a/addons/actions/src/models/ActionsFunction.ts +++ b/addons/actions/src/models/ActionsFunction.ts @@ -1,6 +1,5 @@ import { ActionOptions } from './ActionOptions'; import { ActionsMap } from './ActionsMap'; -import { HandlerFunction } from './HandlerFunction'; export interface ActionsFunction { (handlerMap: Record, options?: ActionOptions): ActionsMap; @@ -8,10 +7,7 @@ export interface ActionsFunction { (handler1: T, options?: ActionOptions): ActionsMap; (handler1: T, handler2: T, options?: ActionOptions): ActionsMap; - (handler1: T, handler2: T, handler3: T, options?: ActionOptions): Record< - T, - HandlerFunction - >; + (handler1: T, handler2: T, handler3: T, options?: ActionOptions): ActionsMap; ( handler1: T, handler2: T,