typescript 中关于接口和多态的疑惑?

小夜勃
  • 221

最近学习 typescript 时遇到了一点疑惑, 如下:

class Cat {
    speak() {
        console.log('cat')
    }
}

class Dog implements Animal {
    speak() {
        console.log('dog')
    }
}

interface Animal {
    speak(): void
}

function sayIt(animal: Animal) {
    animal.speak()
}

sayIt(newCat()) // cat
sayIt(newDog()) // dog

Cat这个类似乎并没有实现Animal这个接口, 但仍然可以正确输出. 尽管Cat拥有speak()方法, 但这样做是否违背了多态的本意? 感觉更像是 duck type. 而对于Dog实现了Animal接口, 和预期一样得到了结果.

如果 duck type 存在的话, 接口存在的意义又是什么?

本人使用的 typescript 版本为3.7.2, 且均在严格模式下.

望能有前辈解答, 多谢!

回复
阅读 2.8k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏