interface test{
foo(boo:string);
}
class coo implements test{
foo(){
}
}
在playGround 中,尽管函数签名不像接口所说的那样,但这不会生成和错误,接口的预期行为是强制签名..
为什么会出现这种行为?
谢谢
interface test{
foo(boo:string);
}
class coo implements test{
foo(){
}
}
在playGround 中,尽管函数签名不像接口所说的那样,但这不会生成和错误,接口的预期行为是强制签名..
为什么会出现这种行为?
谢谢
这很有趣。TypeScript 团队非常聪明,他们决定故意这样做。
这个想法是,如果你的函数可以在不传递参数的情况下正确运行,它可以安全地忽略参数并满足接口。这意味着您可以替换您的实现,而无需更新所有调用代码。
该接口确保在您使用接口的所有情况下都传递参数 - 因此您可以对调用者进行类型检查,并且您的具体类不需要任何参数实际上并不重要。
我不满意接口如何不强制执行方法签名。我相信芬顿的解释是错误的。真正的原因是 Typescript 使用的是“ duck typing ”。使用更少的参数不会出错,但是如果使用更多的参数,你会得到错误。长答案可以在这里找到为什么 TypeScript 中的类允许使用鸭子类型
最后,Interface 无法适应由其他类扩展的抽象类的角色。我不建议将接口与类一起使用,而是更好地在实际类上使用“实现”一词,如果没有额外的接口类,它的作用相同。
Typescript 使用结构类型。实现的函数的参数可以比接口中的函数声明少,但不能多。