在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;
类Crow
和Sparrow
都实现了接口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
接口的参数,无论结构是否相同。