首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在使用带依赖项的寄存器方法时,Tsyringe的‘解析’函数会抛出"TypeInfo不知道X“错误

在使用带依赖项的寄存器方法时,Tsyringe的‘解析’函数会抛出"TypeInfo不知道X“错误
EN

Stack Overflow用户
提问于 2022-10-14 05:13:54
回答 1查看 99关注 0票数 0

我在和丁玲玩。当我使用装饰器时,它似乎工作得很好,但是我无法使它与寄存器函数一起工作。

以下是我尝试过的

测试1:确定

这里我只使用@singleton()装饰器,它的工作很好

代码语言:javascript
复制
@singleton()
class Child1 {}

@singleton()
class Child2 {}

@singleton()
class Parent {
  constructor(public readonly child1: Child1, public readonly child2: Child2) {}
}

const parent = container.resolve(Parent);

expect(parent).toBeInstanceOf(Parent);
expect(parent.child1).toBe(container.resolve(Child1));
expect(parent.child2).toBe(container.resolve(Child2));

测试2:错误

我原以为这和以前的一样。我通过registerSingleton方法注册,而不是通过@singleton()装饰器注册。但是,container.resolve抛出不以“父”错误闻名的TypeInfo。

代码语言:javascript
复制
class Child1 {}
class Child2 {}

class Parent {
  constructor(public readonly child1: Child1, public readonly child2: Child2) {}
}

container.registerSingleton(Child1);
container.registerSingleton(Child2);
container.registerSingleton(Parent);

const parent = container.resolve(Parent);

expect(parent).toBeInstanceOf(Parent);
expect(parent.child1).toBe(container.resolve(Child1));
expect(parent.child2).toBe(container.resolve(Child2));

测试3:错误

我也希望这和第一次一样。我通过register方法注册,而不是通过@singleton()装饰器注册。同样,container.resolve抛出不以“父”错误闻名的TypeInfo。

代码语言:javascript
复制
class Child1 {}
class Child2 {}

class Parent {
  constructor(public readonly child1: Child1, public readonly child2: Child2) {}
}

container.register(Child1, { useClass: Child1 }, { lifecycle: Lifecycle.Singleton });
container.register(Child2, { useClass: Child2 }, { lifecycle: Lifecycle.Singleton });
container.register(Parent, { useClass: Parent }, { lifecycle: Lifecycle.Singleton });

const parent = container.resolve(Parent);

expect(parent).toBeInstanceOf(Parent);
expect(parent.child1).toBe(container.resolve(Child1));
expect(parent.child2).toBe(container.resolve(Child2));

测试4:好

然后删除构造函数参数并使用register方法。也很好,也很好。

代码语言:javascript
复制
class Parent {}

container.register(Parent, { useClass: Parent }, { lifecycle: Lifecycle.Singleton });

const parent1 = container.resolve(Parent);
const parent2 = container.resolve(Parent);

expect(parent1).toBeInstanceOf(Parent);
expect(parent1).toBe(parent2);

问题

我在测试2和3中做错了什么?

更新

我查过注射器单元测试了。在测试构造函数注入的所有情况下,类都使用@injectable()@singleton()进行修饰。

然后,我发现@injectable()生成了一个typeInfo.set(target, getParamInfo(target)); 打电话 (也是@singleton调用@injectable)。据我所知,这将修饰类的构造函数参数设置为名为typeInfo的全局映射。registerregisterSingleton没有打这个电话。因此,当我尝试resolve时,我得到了一个"TypeInfo not“错误

我不确定这是一个bug还是一个特性。

Update2

据我所知,它既不是一个bug,也不是一个特性。这只是一个限制。Tsyringe中的构造函数参数类型解析依赖于"Reflect.getMetadata“(我认为没有其他东西可以依赖),它只能在使用装饰器时使用。因此,只有由Tysringe的装饰器(如@injectable()@singleton()等)修饰类的依赖项时,才能注入它。

EN

回答 1

Stack Overflow用户

发布于 2022-10-22 13:05:08

我陷入了太多的麻烦与注射器和倒置。我编写了一个不同的DI lib https://itijs.org/,它更适合我。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74064575

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档