我正在实现一个commandBus,我想用命令处理程序注册命令类型,以将传入的命令映射到正确的命令处理程序.我传递了一个命令构造函数来映射到一个像handler这样的处理程序构造函数(handle
我终于孤立了原因.在typescript中,您不能定义参数arg typeof X并传入构造函数Y,如果’Y extends X则传递事件.构造函数必须具有相同的签名.
检查那个片段.在底部,甚至commandBus.register(Object)也不会抛出编译错误.
class BaseClass{} class DerivedClass extends BaseClass{ constructor(b : number) { super(); } } class AnotherClass extends BaseClass{ constructor(){ super(); } } class CommandBus { register(handler : typeof BaseClass) {} } var commandBus = new CommandBus(); commandBus.register(DerivedClass); // Argument of type 'typeof DerivedClass' is not assignable to parameter of type 'typeof BaseClass'. commandBus.register(AnotherClass); // Compiles commandBus.register(Function); // Compiles commandBus.register(Object); // Compiles
我得到它的唯一方法是添加一个重载构造函数签名
class DerivedClass extends BaseClass{ constructor(b? : any); constructor(b : number) { super(); } }
但这是我还是这个该死的?
任何人都可以指出我如何摆脱这些编译器错误的方向,而不是在整个地方添加无用的过载签名的肮脏黑客?
你在这里要说的是你想要一个带有任意数量参数的BaseClass的构造函数.你可以写这种类型:class CommandBus { register(handler: new(...args: any[]) => BaseClass) {} }
请注意,错误是100%正确的.如果你写过
class CommandBus { register(handler : typeof BaseClass) { var x = new handler(); } } var c = new CommandBus(); c.register(DerivedClass);
您将零参数传递给DerivedClass构造函数.
这些线路在这里
commandBus.register(Function); // Compiles commandBus.register(Object); // Compiles
只编译因为BaseClass没有成员(记住,TypeScript使用结构类型系统,所以空类型可以从任何类型分配!).如果向BaseClass添加任何不在Function或Object中的属性或方法,则这些行将成为错误.