gpt4 book ai didi

TypeScript 不强制接口(interface)

转载 作者:搜寻专家 更新时间:2023-10-30 21:54:36 27 4
gpt4 key购买 nike

考虑接口(interface) 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');

这是我的问题。 Civilian类没有实现ComicBookCharacter接口(interface),但是SuperHero仍然可以通过Civilian参数实现fight方法。

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

spiderMan.fight(mj);

附带说明:如果我将 SuperHeru 类中的 villian 类型更改为字符串,它会给我一个编译错误。在我看来,这是一种错误的行为。蜘蛛侠应该斗不过玛丽珍吧!

最佳答案

您明确接受一个Civilian作为参数:

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

class Civilian{}

class SuperHero implements ComicBookCharacter {
name:string;
// You explicitly accept Civilian
fight = (villian: Civilian) => {};
}

这个接口(interface)实现是允许的,因为函数参数类型是双变的,(正如 Ryan 所指出的)

PS:相关https://typescript.codeplex.com/workitem/2282特别是:https://typescript.codeplex.com/workitem/2282#CommentContainer6

关于TypeScript 不强制接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22272095/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com