考虑一下接口CommicBookCharacter
interface CommicBookCharacter {
name: string;
fight : (nemisis: CommicBookCharacter) => void;
}这可以由英雄和小精灵来实现。除了这些人物,还有平民。
class Civilian{
constructor(public name: string) {}
}下面是如何实现英雄
class SuperHero implements CommicBookCharacter {
fight: (villian: Civilian) => void;
constructor(public name: string) {
this.fight = (hero)=> {
alert(this.name + ' is struggling back');
};
}
}让我们也创建一些字符。
var spiderMan= new SuperHero('Spider Man');
var mj = new Civilian('Mary Jane');这是我的问题。民用类不实现ComicBookCharacter接口,但SuperHero仍然可以使用民用参数实现can方法。
这导致了一些不好的问题:
spiderMan.fight(mj);顺便提一句:如果我将SuperHeru类中的villian类型更改为string,它将给我一个编译错误。在我看来,这是一种错误的行为。SpiderMan不应该能够对抗玛丽简!
发布于 2014-03-08 23:13:35
您正在显式地接受一个Civilian作为参数:
interface ComicBookCharacter {
name: string;
fight: (nemisis: ComicBookCharacter) => void;
}
class Civilian{}
class SuperHero implements ComicBookCharacter {
name:string;
// You explicitly accept Civilian
fight = (villian: Civilian) => {};
}这个接口实现是允许的,因为函数参数类型是双变量的,(正如Ryan所指出的)
PS:相关https://typescript.codeplex.com/workitem/2282,特别是:https://typescript.codeplex.com/workitem/2282#CommentContainer6
https://stackoverflow.com/questions/22272095
复制相似问题