Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 类型脚本不强制执行接口_Typescript - Fatal编程技术网

Typescript 类型脚本不强制执行接口

Typescript 类型脚本不强制执行接口,typescript,Typescript,考虑接口CommicBookCharacter interface CommicBookCharacter { name: string; fight : (nemisis: CommicBookCharacter) => void; } 可以由heros和villian实现。除了这些人物,还有平民 class Civilian{ constructor(public name: string) {} } 下面是如何实现英雄的 class SuperHero i

考虑接口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接口,但超级英雄仍然可以使用民用参数实现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
作为参数类型,它将无法成功编译。如果这不是你的意思,你能提供更多关于这个问题的细节吗?他们确实结婚了。战斗是不可避免的,而不是一只虫子;这是故意的。函数参数类型是双变量的。