diff --git a/packages/mobx/CHANGELOG.md b/packages/mobx/CHANGELOG.md index be5778622..d39a31053 100644 --- a/packages/mobx/CHANGELOG.md +++ b/packages/mobx/CHANGELOG.md @@ -1,5 +1,11 @@ # mobx +## 6.15.3 + +### Patch Changes + +- [`25e859a3582bcdd3c5a71aa52510adfd924a1a60`](https://github.com/mobxjs/mobx/commit/25e859a3582bcdd3c5a71aa52510adfd924a1a60) [#4644](https://github.com/mobxjs/mobx/pull/4644) Thanks [@kubk](https://github.com/kubk)! - Fix TypeScript errors when using `flow` as a standard decorator. + ## 6.15.2 ### Patch Changes diff --git a/packages/mobx/__tests__/decorators_20223/stage3-decorators.ts b/packages/mobx/__tests__/decorators_20223/stage3-decorators.ts index 7b788ca68..db1eb120b 100644 --- a/packages/mobx/__tests__/decorators_20223/stage3-decorators.ts +++ b/packages/mobx/__tests__/decorators_20223/stage3-decorators.ts @@ -1052,6 +1052,62 @@ test("it should support asyncAction as decorator (2022.3)", async () => { expect(await x.f(3)).toBe(16) }) +test("it should support flow as decorator (2022.3)", async () => { + class DecoratorInferred { + @mobx.flow + *f() { + return true + } + } + + class DecoratorExplicit { + @mobx.flow + *f(): Generator { + return true + } + } + + class AutoObservable { + constructor() { + mobx.makeAutoObservable(this) + } + + *f() { + return true + } + } + + class ExplicitObservable { + constructor() { + mobx.makeObservable(this, { + f: mobx.flow + }) + } + + *f() { + return true + } + } + + class FlowField { + f = mobx.flow(function* () { + return true + }) + } + + const decoratorInferredResult: boolean = await mobx.flowResult(new DecoratorInferred().f()) + const decoratorExplicitResult: boolean = await mobx.flowResult(new DecoratorExplicit().f()) + const autoObservableResult: boolean = await mobx.flowResult(new AutoObservable().f()) + const explicitObservableResult: boolean = await mobx.flowResult(new ExplicitObservable().f()) + const flowFieldResult: boolean = await new FlowField().f() + + expect(decoratorInferredResult).toBe(true) + expect(decoratorExplicitResult).toBe(true) + expect(autoObservableResult).toBe(true) + expect(explicitObservableResult).toBe(true) + expect(flowFieldResult).toBe(true) +}) + test("toJS bug #1413 (2022.3)", () => { class X { @observable diff --git a/packages/mobx/package.json b/packages/mobx/package.json index d4d606b80..0821cb65f 100644 --- a/packages/mobx/package.json +++ b/packages/mobx/package.json @@ -1,6 +1,6 @@ { "name": "mobx", - "version": "6.15.2", + "version": "6.15.3", "description": "Simple, scalable state management.", "source": "src/mobx.ts", "main": "dist/index.js", diff --git a/packages/mobx/src/api/flow.ts b/packages/mobx/src/api/flow.ts index 43b00715c..9a635858d 100644 --- a/packages/mobx/src/api/flow.ts +++ b/packages/mobx/src/api/flow.ts @@ -35,7 +35,14 @@ export function isFlowCancellationError(error: Error) { export type CancellablePromise = Promise & { cancel(): void } -interface Flow extends Annotation, PropertyDecorator, ClassMethodDecorator { +type FlowGenerator = (...args: any[]) => Generator | AsyncGenerator + +// PropertyDecorator is only for legacy decorators +interface Flow extends Annotation, PropertyDecorator { + ( + value: Value, + context: ClassMethodDecoratorContext + ): Value | void ( generator: (...args: Args) => Generator | AsyncGenerator ): (...args: Args) => CancellablePromise