TypeScript不强制接口

时间:2014-03-08 16:42:06

标签: typescript

考虑接口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,它会给我一个编译错误。在我看来,这是一个错误的行为。蜘蛛侠不应该和玛丽珍战斗!

1 个答案:

答案 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