【问题标题】:TS Interface doesn't force functions signature on implementersTS 接口不会对实现者强制执行函数签名
【发布时间】:2012-10-20 16:20:37
【问题描述】:
interface test{
    foo(boo:string);
}
class coo implements test{
    foo(){

    }
}

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

为什么会出现这种行为?

谢谢

【问题讨论】:

    标签: interface signature typescript


    【解决方案1】:

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

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

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

    Interface Function Parameter Not Enforced

    【讨论】:

    • 我认为这是一个错误太明显了..等待如果有人有另一个答案然后生病标记答案..谢谢
    • 根据 TypeScript 团队的反馈更新。
    • 谢谢,但对我来说,我更喜欢检查参数以确保正确实现,有人可以说如果我有一个不在接口中的函数 a(arg1) ......说..没有 arg1 就不能调用它,除非使用 '?' 不需要 arg1 ..
    • function v(x:number){}; v();// generates error in play ground
    • 是的——就像我说的,调用代码必须遵守类型和接口,即使实现代码选择省略参数。如果您希望调用代码能够跳过参数,您可以将其设为可选:v (x?: number){}
    【解决方案2】:

    我不满意 Interface 也不强制执行方法签名。我相信芬顿的解释是错误的。真正的原因是 Typescript 使用的是“duck typing”。参数越少也不会出错,但是参数越多就会出错。长答案可以在这里找到Why duck typing is allowed for classes in TypeScript

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-05-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-19
        • 1970-01-01
        相关资源
        最近更新 更多