【发布时间】:2016-10-24 19:41:13
【问题描述】:
考虑一个具有两个实现的 TypeScript 接口:
interface IFoo {}
class FooA implements IFoo {}
class FooB implements IFoo {}
接下来,考虑一个接受IFoo 的实现作为类型参数的通用接口:
interface IFooHandler<F extends IFoo> {
handle(foo: F): string
}
现在,我们来实现IFooHandler接口,具体实现IFoo作为类型参数:
class FooAHandler implements IFooHandler<FooA> {
handle(foo: FooB): string {
return "Hello, Foo A!";
}
}
在 2.0.3 版本中使用 tsc 编译完美。所以这是我的问题:为什么会编译?
请注意,我在FooAHandler 的handle() 函数中使用了FooB 作为参数类型。我假设这段代码会触发编译器错误,因为IFooHandler<F> 接口规定handle 方法应该接受F 类型的参数(因此,如果是IFooHandler<FooA>,则类型为FooA -- 并且不是FooB)。
我在 TypeScript 文档中找不到有关此行为的任何信息。这种行为是否是故意的,如果是,其背后的原因是什么?还是我只是以错误的方式使用此功能?
只是为了比较,在 Java 中实现完全相同的示例(省略代码,因为它非常相似)会产生(预期的)编译错误:
FooAHandler.java:1: 错误 FooAHandler 不是抽象的并且没有覆盖 IFooHandler 中的抽象方法句柄(FooA)
【问题讨论】:
-
这在常见问题解答中已多次讨论 - github.com/Microsoft/TypeScript/wiki/… 和 github.com/Microsoft/TypeScript/wiki/… 和
-
@RyanCavanaugh,感谢您的链接。哎呀,我不敢相信我错过了常见问题解答中的第一个问题。无论如何,这种行为现在对我来说更有意义了!感谢您的评论。
标签: generics typescript