Node.js 占用空间小的typescript依赖项注入

Node.js 占用空间小的typescript依赖项注入,node.js,typescript,dependency-injection,inversifyjs,Node.js,Typescript,Dependency Injection,Inversifyjs,我不熟悉nodejs和typescript,来自C#。 我想在我的项目中使用依赖注入,发现最流行的包是inversify 我开始使用它,但我不喜欢这样的事实,我必须添加装饰 例如,我需要在构造函数中的参数之前添加@inject,这让我很烦恼: public constructor( @inject(TYPES.Weapon) katana: Weapon, @inject(TYPES.ThrowableWeapon) shuriken: ThrowableWeapon ) 这意

我不熟悉nodejs和typescript,来自C#。 我想在我的项目中使用依赖注入,发现最流行的包是inversify

我开始使用它,但我不喜欢这样的事实,我必须添加装饰

例如,我需要在构造函数中的参数之前添加@inject,这让我很烦恼:

public constructor(
    @inject(TYPES.Weapon) katana: Weapon,
    @inject(TYPES.ThrowableWeapon) shuriken: ThrowableWeapon
)
这意味着每个类都必须知道对象的类型

我不明白为什么@inject需要字符串文字,而不能仅仅根据类型进行注入


有没有更简洁的方法可以做到这一点?

与严格类型化的语言相比,类型脚本类型在运行时并不存在。可以在运行时使用类型信息进行依赖项注入,但方式有限。通过使用
emitDecoratorMetadata
TypeScript选项,可以获取构造函数参数类型并将其用于DI

示例是,这是从库中提取的用于独立使用的角度注入器。在启用DI的类上只需要使用
@Injectable
修饰符,
@injection
参数修饰符是可选的

限制是,只有类实例可以通过这种方式注入:

constructor(foo: FooClass) {}
忽略并丢弃泛型:

constructor(foo: FooClass<Bar>) {}
同样:

在具体注入的情况下,您可以简单地定义构造函数 参数,而不使用@Injectdecorator

InversifyJS还支持TypeScript的构造函数赋值,因此 可以在参数和中使用私有或受保护的访问修饰符 容器注入依赖项不会有问题


如果它们是类,但在列出的示例中,
@inject
throwablebreault
可以省略
@inject
,因此
@inject
是必要的。

“仅基于类型”-我不熟悉该库,但TS本身在运行时不存在。我理解。。。因此,如果我想使用接口,我必须使用装饰器。是的。或者您可以坚持使用类,因为它们允许您省略@inject。在TS类中,类充当接口,但在运行时也存在。您认为“n TS类充当接口,但在运行时也存在”是什么意思?可以使用
class Foo{}
作为类型(接口),如
let Foo:Foo
,但它仍然是一个可以在运行时使用的类(函数),
Foo=new Foo
。这就是答案中列出的DI LIB所使用的质量。如果
Foo
interface Foo{}
,您就不能这样做。这就是TS与C#的不同之处。
constructor(foo: fooSymbol) {}

constructor(foo: 'foo string provider') {}