首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TypeScript不强制接口

TypeScript不强制接口
EN

Stack Overflow用户
提问于 2014-03-08 16:42:05
回答 1查看 848关注 0票数 2

考虑一下接口CommicBookCharacter

代码语言:javascript
复制
interface CommicBookCharacter {
    name: string;
    fight : (nemisis: CommicBookCharacter) => void;
}

这可以由英雄和小精灵来实现。除了这些人物,还有平民。

代码语言:javascript
复制
class Civilian{
    constructor(public name: string) {}
}

下面是如何实现英雄

代码语言:javascript
复制
class SuperHero implements CommicBookCharacter {
    fight: (villian: Civilian) => void;

     constructor(public name: string) {
        this.fight = (hero)=> {
            alert(this.name + ' is struggling back');
        };
    }
}

让我们也创建一些字符。

代码语言:javascript
复制
var spiderMan= new SuperHero('Spider Man');
var mj = new Civilian('Mary Jane');

这是我的问题。民用类不实现ComicBookCharacter接口,但SuperHero仍然可以使用民用参数实现can方法。

这导致了一些不好的问题:

代码语言:javascript
复制
spiderMan.fight(mj);

顺便提一句:如果我将SuperHeru类中的villian类型更改为string,它将给我一个编译错误。在我看来,这是一种错误的行为。SpiderMan不应该能够对抗玛丽简!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-08 23:13:35

您正在显式地接受一个Civilian作为参数:

代码语言:javascript
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22272095

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档