diff --git a/src/lazy_helper.ts b/src/lazy_helper.ts index 51bac58..98eb4d6 100644 --- a/src/lazy_helper.ts +++ b/src/lazy_helper.ts @@ -7,9 +7,12 @@ function createHandler(delayedObject: () => T): ProxyHandler = {}; const install = (name: keyof ProxyHandler) => { handler[name] = (...args: any[]) => { - args[0] = delayedObject(); + const instance = args[0] = delayedObject(); const method = Reflect[name]; - return (method as any)(...args); + const result = (method as any)(...args); + return typeof result === 'function' + ? result.bind(instance) + : result; }; }; reflectMethods.forEach(install); diff --git a/test/container.test.ts b/test/container.test.ts index d3b8fcd..44c7d68 100644 --- a/test/container.test.ts +++ b/test/container.test.ts @@ -12,6 +12,7 @@ import ClassB from './fixtures/value/b'; import LazyCClass from './fixtures/lazy/lazy_c'; import LazyBClass from './fixtures/lazy/lazy_b'; import LazyAClass from './fixtures/lazy/lazy_a'; +import LazyDClass from './fixtures/lazy/lazy_d'; const ctx = {}; const container = new Container('default'); @@ -282,10 +283,13 @@ describe('container#lazy', () => { const instance = container.get(LazyAClass); expect(instance).toBeInstanceOf(LazyAClass); container.set({ type: LazyBClass }); + container.set({ type: LazyDClass }); expect(instance.lazyB).toBeDefined(); expect(instance.lazyB).toBeInstanceOf(LazyBClass); expect(instance.lazyB === instance.lazyB).toBeTruthy(); expect(instance.lazyB.name).toBe('lazyBClass'); + expect(instance.lazyB.testLazyD()).toBe('a,b'); + container.set({ type: LazyCClass }); const instanceb = container.get(LazyBClass); expect(instanceb.lazyC).toBeDefined(); diff --git a/test/fixtures/lazy/lazy_b.ts b/test/fixtures/lazy/lazy_b.ts index 0e7512f..004f83e 100644 --- a/test/fixtures/lazy/lazy_b.ts +++ b/test/fixtures/lazy/lazy_b.ts @@ -1,9 +1,19 @@ import LazyC from './lazy_c'; +import LazyD from './lazy_d'; import { Inject, Injectable } from '../../../src'; @Injectable() export default class LazyBClass { @Inject({ lazy: true }) lazyC!: LazyC; + + @Inject({ lazy: true }) + lazyD!: LazyD; + public name = 'lazyBClass'; -} \ No newline at end of file + + testLazyD() { + this.lazyD.set('a', 'b'); + return this.lazyD.doSomething(); + } +} diff --git a/test/fixtures/lazy/lazy_d.ts b/test/fixtures/lazy/lazy_d.ts new file mode 100644 index 0000000..96f0329 --- /dev/null +++ b/test/fixtures/lazy/lazy_d.ts @@ -0,0 +1,8 @@ +import { Injectable } from '../../../src'; + +@Injectable() +export default class LazyDClass extends Map { + doSomething() { + return Array.from(this.entries()).join(','); + } +}