考虑接口CommicBookCharacter
interface CommicBookCharacter {
name: string;
fight : (nemisis: CommicBookCharacter) => void;
}
可以由heros和villian实现。除了这些人物,还有平民
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仍然可以用Civilian参数实现war方法。
这会导致一些不好的问题:
spiderMan.fight(mj);
作为旁注:如果我将SuperHeru类中的villian类型更改为string,它会给我一个编译错误。在我看来,这是一个错误的行为。蜘蛛侠不应该和玛丽珍战斗!
答案 0 :(得分:1)
您明确接受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