【发布时间】:2015-10-30 18:30:03
【问题描述】:
我正在实现一个 commandBus,我想用命令处理程序注册命令类型,以将传入的命令映射到正确的命令处理程序。我传递了一个命令构造函数来映射到一个处理程序构造函数,例如register(handler : typeof Handler, command : typeof Command)。但我不断收到编译错误。
我终于找出了原因。在打字稿中,您不能定义参数arg typeof X 并传入构造函数Y,如果是'Y extends X 的事件。 构造函数必须具有相同的签名。
检查sn-p。在底部,即使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();
}
}
但是是我还是这该死的丑陋?
谁能指出我如何摆脱这些编译器错误,而无需到处添加无用的重载签名的肮脏技巧?
【问题讨论】:
标签: inheritance static compiler-errors typescript