Skip to content

Commit

Permalink
Merge pull request #796 from mobxjs/feature/action-interface
Browse files Browse the repository at this point in the history
feat: added IAction to action function return type
  • Loading branch information
mweststrate committed Jan 26, 2017
2 parents 185cc13 + bb4625d commit 67f8255
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 24 deletions.
42 changes: 21 additions & 21 deletions src/api/action.ts
Original file line number Diff line number Diff line change
@@ -1,27 +1,27 @@
import {invariant, addHiddenProp} from "../utils/utils";
import {createClassPropertyDecorator} from "../utils/decorators";
import {createAction, executeAction} from "../core/action";
import {createAction, executeAction, IAction} from "../core/action";

export interface IActionFactory {
// nameless actions
<A1, R, T extends (a1: A1) => R>(fn: T): T;
<A1, A2, R, T extends (a1: A1, a2: A2) => R>(fn: T): T;
<A1, A2, A3, R, T extends (a1: A1, a2: A2, a3: A3) => R>(fn: T): T;
<A1, A2, A3, A4, R, T extends (a1: A1, a2: A2, a3: A3, a4: A4) => R>(fn: T): T;
<A1, A2, A3, A4, A5, R, T extends (a1: A1, a2: A2, a3: A3, a4: A4, a5: A5) => R>(fn: T): T;
<A1, A2, A3, A4, A5, A6, R, T extends (a1: A1, a2: A2, a3: A3, a4: A4, a6: A6) => R>(fn: T): T;
<A1, R, T extends (a1: A1) => R>(fn: T): T & IAction;
<A1, A2, R, T extends (a1: A1, a2: A2) => R>(fn: T): T & IAction;
<A1, A2, A3, R, T extends (a1: A1, a2: A2, a3: A3) => R>(fn: T): T & IAction;
<A1, A2, A3, A4, R, T extends (a1: A1, a2: A2, a3: A3, a4: A4) => R>(fn: T): T & IAction;
<A1, A2, A3, A4, A5, R, T extends (a1: A1, a2: A2, a3: A3, a4: A4, a5: A5) => R>(fn: T): T & IAction;
<A1, A2, A3, A4, A5, A6, R, T extends (a1: A1, a2: A2, a3: A3, a4: A4, a6: A6) => R>(fn: T): T & IAction;

// named actions
<A1, R, T extends (a1: A1) => R>(name: string, fn: T): T;
<A1, A2, R, T extends (a1: A1, a2: A2) => R>(name: string, fn: T): T;
<A1, A2, A3, R, T extends (a1: A1, a2: A2, a3: A3) => R>(name: string, fn: T): T;
<A1, A2, A3, A4, R, T extends (a1: A1, a2: A2, a3: A3, a4: A4) => R>(name: string, fn: T): T;
<A1, A2, A3, A4, A5, R, T extends (a1: A1, a2: A2, a3: A3, a4: A4, a5: A5) => R>(name: string, fn: T): T;
<A1, A2, A3, A4, A5, A6, R, T extends (a1: A1, a2: A2, a3: A3, a4: A4, a6: A6) => R>(name: string, fn: T): T;
<A1, R, T extends (a1: A1) => R>(name: string, fn: T): T & IAction;
<A1, A2, R, T extends (a1: A1, a2: A2) => R>(name: string, fn: T): T & IAction;
<A1, A2, A3, R, T extends (a1: A1, a2: A2, a3: A3) => R>(name: string, fn: T): T & IAction;
<A1, A2, A3, A4, R, T extends (a1: A1, a2: A2, a3: A3, a4: A4) => R>(name: string, fn: T): T & IAction;
<A1, A2, A3, A4, A5, R, T extends (a1: A1, a2: A2, a3: A3, a4: A4, a5: A5) => R>(name: string, fn: T): T & IAction;
<A1, A2, A3, A4, A5, A6, R, T extends (a1: A1, a2: A2, a3: A3, a4: A4, a6: A6) => R>(name: string, fn: T): T & IAction;

// generic forms
<T extends Function>(fn: T): T;
<T extends Function>(name: string, fn: T): T;
<T extends Function>(fn: T): T & IAction;
<T extends Function>(name: string, fn: T): T & IAction;

// named decorator
(customName: string): (target: Object, key: string, baseDescriptor?: PropertyDescriptor) => void;
Expand All @@ -30,12 +30,12 @@ export interface IActionFactory {
(target: Object, propertyKey: string, descriptor?: PropertyDescriptor): void;

// .bound
bound<A1, R, T extends (a1: A1) => R>(fn: T): T;
bound<A1, A2, R, T extends (a1: A1, a2: A2) => R>(fn: T): T;
bound<A1, A2, A3, R, T extends (a1: A1, a2: A2, a3: A3) => R>(fn: T): T;
bound<A1, A2, A3, A4, R, T extends (a1: A1, a2: A2, a3: A3, a4: A4) => R>(fn: T): T;
bound<A1, A2, A3, A4, A5, R, T extends (a1: A1, a2: A2, a3: A3, a4: A4, a5: A5) => R>(fn: T): T;
bound<A1, A2, A3, A4, A5, A6, R, T extends (a1: A1, a2: A2, a3: A3, a4: A4, a6: A6) => R>(fn: T): T;
bound<A1, R, T extends (a1: A1) => R>(fn: T): T & IAction;
bound<A1, A2, R, T extends (a1: A1, a2: A2) => R>(fn: T): T & IAction;
bound<A1, A2, A3, R, T extends (a1: A1, a2: A2, a3: A3) => R>(fn: T): T & IAction;
bound<A1, A2, A3, A4, R, T extends (a1: A1, a2: A2, a3: A3, a4: A4) => R>(fn: T): T & IAction;
bound<A1, A2, A3, A4, A5, R, T extends (a1: A1, a2: A2, a3: A3, a4: A4, a5: A5) => R>(fn: T): T & IAction;
bound<A1, A2, A3, A4, A5, A6, R, T extends (a1: A1, a2: A2, a3: A3, a4: A4, a6: A6) => R>(fn: T): T & IAction;

// .bound decorator
bound(target: Object, propertyKey: string, descriptor?: PropertyDescriptor): void;
Expand Down
9 changes: 7 additions & 2 deletions src/core/action.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,20 @@ import {isSpyEnabled, spyReportStart, spyReportEnd} from "../core/spy";
import {isComputedValue} from "../core/computedvalue";
import {globalState} from "../core/globalstate";

export function createAction(actionName: string, fn: Function): Function {
export interface IAction{
originalFn: Function
isMobxAction: boolean
}

export function createAction(actionName: string, fn: Function): Function & IAction {
invariant(typeof fn === "function", "`action` can only be invoked on functions");
invariant(typeof actionName === "string" && actionName.length > 0, `actions should have valid names, got: '${actionName}'`);
const res = function () {
return executeAction(actionName, fn, this, arguments);
};
(res as any).originalFn = fn;
(res as any).isMobxAction = true;
return res;
return res as any;
}

export function executeAction(actionName: string, fn: Function, scope?: any, args?: IArguments) {
Expand Down
2 changes: 1 addition & 1 deletion src/mobx.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ export { IAtom, Atom, BaseAtom } from "./core/ato
export { IObservable, IDepTreeNode } from "./core/observable";
export { Reaction, IReactionPublic, IReactionDisposer } from "./core/reaction";
export { IDerivation, untracked, IDerivationState } from "./core/derivation";
export { useStrict, isStrictModeEnabled } from "./core/action";
export { useStrict, isStrictModeEnabled, IAction } from "./core/action";
export { spy } from "./core/spy";
export { IComputedValue } from "./core/computedvalue";

Expand Down

0 comments on commit 67f8255

Please sign in to comment.