10
interface test{
    foo(boo:string);
}
class coo implements test{
    foo(){

    }
}

playGround 中,尽管函数签名不像接口所说的那样,但这不会生成和错误,接口的预期行为是强制签名..

为什么会出现这种行为?

谢谢

4

3 回答 3

6

这很有趣。TypeScript 团队非常聪明,他们决定故意这样做。

这个想法是,如果你的函数可以在不传递参数的情况下正确运行,它可以安全地忽略参数并满足接口。这意味着您可以替换您的实现,而无需更新所有调用代码。

该接口确保在您使用接口的所有情况下都传递参数 - 因此您可以对调用者进行类型检查,并且您的具体类不需要任何参数实际上并不重要。

接口函数参数未强制执行

于 2012-10-31T09:13:49.517 回答
1

我不满意接口如何不强制执行方法签名。我相信芬顿的解释是错误的。真正的原因是 Typescript 使用的是“ duck typing ”。使用更少的参数不会出错,但是如果使用更多的参数,你会得到错误。长答案可以在这里找到为什么 TypeScript 中的类允许使用鸭子类型

最后,Interface 无法适应由其他类扩展的抽象类的角色。我不建议将接口与类一起使用,而是更好地在实际类上使用“实现”一词,如果没有额外的接口类,它的作用相同。

于 2019-08-08T16:20:37.987 回答
0

Typescript 使用结构类型。实现的函数的参数可以比接口中的函数声明少,但不能多。

于 2020-11-10T00:14:59.813 回答