检测TypeScript中的循环依赖关系

检测TypeScript中的循环依赖关系,typescript,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

我已经实现了一个服务容器,它能够通过
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');
有趣的是
Reflect.getMetadata('design:paramtypes',target)
for
Foo
返回
未定义的
。一旦循环依赖项更改为非循环依赖项,就会再次返回正确的类型

容器实现可能与此无关,但查看
服务
装饰器可能会很有趣:

export const Service = () : ClassDecorator => {
  return (target: any): void => {
    console.log(Reflect.getMetadata(DESIGN_PARAM_TYPES, target));
  }
};
当依赖项变成循环时,它会记录
未定义的
,否则会正确返回所需的类型


我的目标是在循环依赖项上抛出一个适当的异常——但我现在不可能检测到。为什么?如何解决这个问题?

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


注入服务时,我检查
未定义的
,并抛出
服务ResolvingFailedException
。这不完全是我想要的,但至少可以告诉开发人员发生了什么。

我觉得这是反射元数据的一个bug。我所知道的检测类型中使用的循环依赖关系的唯一方法是检查AST。使用我的库,您可以构建类之间所有依赖关系的图,然后在循环引用发生时抛出。或者,有一种方法可以添加一个测试,该测试在
design:paramtypes
返回undefined时运行所有类并抛出。我不确定是否可以只使用反射元数据。。。我对它了解得不够。你找到解决方案了吗?在这种情况下,我抛出异常,表明存在循环依赖。
export const Service = () : ClassDecorator => {
  return (target: any): void => {
    console.log(Reflect.getMetadata(DESIGN_PARAM_TYPES, target));
  }
};