TypeScript中的多态性

时间:2018-05-07 10:21:16

标签: typescript polymorphism

在TypeScript中尝试多态性我发现了一种奇怪的行为。至少我认为这是一种奇怪的行为,我自己来自Java,规则往往比TypeScript更严格。

所以,我创建了一个小例子来展示TypeScript只尊重结构,而不是在类中实现和使用接口背后的逻辑思想。

interface Bird {
    tweet(): string;
}

class Crow implements Bird {
    constructor(private message: string) { }

    tweet(): string {
        return this.message + "<br />";
    }
}

class Sparrow implements Bird {
    constructor(private message: string) { }

    tweet(): string {
        return this.message + "<br />";
    }
}

class ManWithAHat {
    constructor(private message: string) { }

    tweet(): string {
        return this.message + "<br />";
    }
}

class Chitter {
    static do(bird: Bird): string {
        return bird.tweet();
    }
}

// Getter for num returned 4
let element = document.getElementById('content');
let output: string = "";

const crow = new Crow("Crow says something!");
output += Chitter.do(crow);

const sparrow = new Sparrow("Sparrow says something!");
output += Chitter.do(sparrow);

const manWithAHat = new ManWithAHat("A man with a hat shouldn't be able to talk!");
output += Chitter.do(manWithAHat);

element.innerHTML = output;

CrowSparrow都实现了接口Bird,迫使它们实现tweet(): string方法。类ManWithAHad未实现Bird接口,但巧合具有相同的方法tweet(): string。类do(bird: Bird): string中的静态方法Chitter仅接受Bird作为值。然后将所有三个类实例化并传递给Chitter.do(bird: Bird): string

现在,没有错误。 Chitter.do(bird: Bird): string接受所有三个类,甚至是ManWithAHat类。

我的问题是,是否存在Chitter.do(bird: Bird): string接受ManWithAHat作为参数的实际情况?基于此,我的第二个问题是TypeScript中是否有一种方法强制Chitter.do(bird: Bird): string拒绝任何未实现Bird接口的参数,无论结构是否相同。

0 个答案:

没有答案