检测TypeScript

时间:2018-01-03 15:14:36

标签: typescript

我已经实现了一个服务容器,它可以通过reflect-metadata解析服务容器来创建服务。在代码中说:

// The services
@Service()
export class Bar {
  constructor() { console.log('i am bar'); }
}

@Service()
export class Foo {
  constructor(bar: Bar) {}
}

// Creating an instance for Foo
Container.get<Foo>('foo');

这导致Foo的已解析实例具有正确注入的Bar实例。

但是在尝试检测循环依赖时,事情变得非常混乱:

@Service()
export class Foo {
  constructor(b: Bar) {}
}

@Service()
export class Bar {
  constructor(f: Foo) {}
}

Container.get<Foo>('foo'); // returns Foo, but not with an injected Bar instance

有趣的是Reflect.getMetadata('design:paramtypes', target) Foo会返回undefined。一旦循环依赖变为非循环,就会再次返回正确的类型。

容器实现在这里可能无关紧要,但看到Service装饰器可能会很有趣:

export const Service = () : ClassDecorator => {
  return (target: any): void => {
    console.log(Reflect.getMetadata(DESIGN_PARAM_TYPES, target));
  }
};

这会在依赖关系变为循环后立即记录undefined,否则会正确返回所需的类型。

我的目标是在循环依赖项上抛出适当的例外 - 但我现在无法检测到它。为什么?以及如何解决这个问题?

1 个答案:

答案 0 :(得分:-1)

目前的解决方法,因为我还没有找到解决方案:

注入服务时,我会检查undefined并抛出ServiceResolvingFailedException。不完全是我想要的,但至少有一些方法可以告诉开发人员发生了什么。