我刚开始输入脚本,只是浏览了他们的教程,在他们的操场上尝试了一些编码,但发现了一些奇怪的东西。
例如,此代码:
class foobar implements Ifoobar
{
full: string;
constructor (public foo, public bar)
{
this.full = foo + bar;
}
}
interface Ifoobar
{
foo: string;
bar: string;
}
function test(ifoobar: Ifoobar)
{
return ifoobar.foo + ifoobar.bar;
}
var obj = new foobar("hello", "world");
document.body.innerHTML = test(obj);
如果你把
class foobar implements Ifoobar
或者只是
class foobar
那么,如果契约本身没有被强制执行,那么使用接口有什么意义呢?
更新
我主要关心的是:
document.body.innerHTML = test(obj);
由于foobar不使用implements ifoobar,这应该会抛出错误,并且方法参数中指定的test(ifoobar:ifoobar)应该只接受ifoobar。在我看来,typescript只是简单地认为foobar是实现ifoobar的,尽管它不是。
最佳答案
typescript使用duck typing,这意味着如果成员匹配,则认为类型兼容。这就是为什么代码在删除implements Ifoobar
之后仍然有效。A:foobar
可以被当作Ifoobar
,因为它拥有由Ifoobar
声明的所有成员。
typescript确实执行了合同。如果删除/重命名成员foo
或bar
,编译器将生成错误。