Typescript 类型脚本不强制执行接口
考虑接口CommicBookCharacterTypescript 类型脚本不强制执行接口,typescript,Typescript,考虑接口CommicBookCharacter interface CommicBookCharacter { name: string; fight : (nemisis: CommicBookCharacter) => void; } 可以由heros和villian实现。除了这些人物,还有平民 class Civilian{ constructor(public name: string) {} } 下面是如何实现英雄的 class SuperHero i
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接口,但超级英雄仍然可以使用民用参数实现fight方法
这会导致一些不好的问题:
spiderMan.fight(mj);
作为旁注:如果我将SuperHeru类中villian的类型更改为,比如说string,它将给我一个编译错误。在我看来,这是一种令人讨厌的行为。蜘蛛侠不应该和玛丽·简战斗 您明确接受了一个
平民
作为参数:
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:特别相关:你的
战斗
明确要求一个平民
实例战斗:(维利安:平民)=>无效
如果使用ComicBookCharacter
作为参数类型,它将无法成功编译。如果这不是你的意思,你能提供更多关于这个问题的细节吗?他们确实结婚了。战斗是不可避免的,而不是一只虫子;这是故意的。函数参数类型是双变量的。