【发布时间】:2012-10-20 16:20:37
【问题描述】:
interface test{
foo(boo:string);
}
class coo implements test{
foo(){
}
}
在playGround 尽管函数签名不是接口,但这不会生成和错误 说,接口的预期行为是强制签名..
为什么会出现这种行为?
谢谢
【问题讨论】:
标签: interface signature typescript
interface test{
foo(boo:string);
}
class coo implements test{
foo(){
}
}
在playGround 尽管函数签名不是接口,但这不会生成和错误 说,接口的预期行为是强制签名..
为什么会出现这种行为?
谢谢
【问题讨论】:
标签: interface signature typescript
这很有趣。 TypeScript 团队非常聪明,他们决定故意这样做。
这个想法是,如果你的函数可以在不传递参数的情况下正确运行,它可以安全地忽略参数并满足接口。这意味着您可以替换您的实现,而无需更新所有调用代码。
接口确保在您使用接口的所有情况下都传递参数 - 因此您可以对调用者进行类型检查,实际上您的具体类不需要任何参数并不重要。
【讨论】:
function v(x:number){}; v();// generates error in play ground
我不满意 Interface 也不强制执行方法签名。我相信芬顿的解释是错误的。真正的原因是 Typescript 使用的是“duck typing”。参数越少也不会出错,但是参数越多就会出错。长答案可以在这里找到Why duck typing is allowed for classes in TypeScript
最终,Interface 无法适应由其他类扩展的抽象类的角色。我不建议将接口与类一起使用,而是更好地在实际类上使用“实现”一词,如果没有额外的接口类,它也会这样做。
【讨论】:
Typescript 使用structural typing。实现的函数的参数可以比接口中的函数声明少,但不能多。
【讨论】: