我在尝试使用TypeScript和接口。我有以下代码:
interface Control {
name: string;
onSelect():string;
}
class Button {
name:string="button";
onSelect = function() {
return "hello";
}
}
var a:Button = new Button();
var b:Control = {"name": "arbitrary", "onSelect": () => { return "ahoy!"; }};
var trigger = function(c:Button) {
console.log(c.name, "says", c.onSelect());
}
trigger(a);
trigger(b);
这段代码编译和运行都没有报错。有人能解释一下为什么我的trigger
函数接受b
,尽管它期望得到一个类型为Button
的参数,而b
的类型为Control
。
即使Button
显式实现了Control
,我也要求得到一个Button
,而不是一个Control
。就所有意图而言,Button
可能包含其他成员。
是TypeScript根据结构相似性自动推断实现吗?是否允许在期望实现类的地方传递接口?(难道不应该反过来吗?)
Button
有一个私有成员,那么只有它本身(或从它继承的类)将被视为兼容类型。如果这是期望的行为,您可以考虑添加一个“虚拟”的私有成员。 - Ryan Cavanaughtrigger
实际上依赖于Button
的其他方面而不仅仅是它使用的成员,则这有点像设计上的问题。 - Ryan Cavanaugh