簡體   English   中英

TypeScript不強制執行接口

[英]TypeScript not enforcing interfaces

考慮接口CommicBookCharacter

interface CommicBookCharacter {
    name: string;
    fight : (nemisis: CommicBookCharacter) => void;
}

英雄和平民都可以實施。 除了這些角色,還有平民

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參數來實現Fight方法。

這會導致一些嚴重的問題:

spiderMan.fight(mj);

附帶說明:如果我將SuperHeru類中villian的類型更改為字符串,則將出現編譯錯誤。 我認為,這是一種越野車行為。 SpiderMan應該無法與Mary Jane戰斗!

您明確接受“ 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM