我刚开始输入脚本,只是浏览了他们的教程,在他们的操场上尝试了一些编码,但发现了一些奇怪的东西。
例如,此代码:

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确实执行了合同。如果删除/重命名成员foobar,编译器将生成错误。

09-28 08:02