如果我有:
var greeter: Greeter = new Sausage();
Greeter
类和Sausage
类都有相同的功能和属性,变量greeter很乐意填充Sausage
...我怎么能停止这个?
例如,以下代码编译正常:(
class Greeter {
greeting: string;
constructor(message: string) {
this.greeting = message;
}
greet() {
return "Hello, " + this.greeting;
}
}
class Sausage {
size: number;
name: string;
greeting: string;
constructor() {
this.size = this.SausageLogic();
}
private SausageLogic(): number {
return this.size * 3;
}
greet() {
return "Hello, ";
}
}
var greeter: Greeter = new Sausage();
答案 0 :(得分:5)
TypeScript使用结构类型系统。即使您没有说Sausage extends Greeter
,Sausage
仍然是Greeter
的子类型,因为它至少具有{{1}的所有相同成员确实。请注意,使用Greeter
(访问其Greeter
属性或调用其greeting
方法)可以执行的任何操作都与greet
合法。
例如,如果要向Sausage
添加方法foo
,或从Greeter
删除greeting
属性,则最后一行代码将成为错误。任何Sausage
成员也足以导致结构不匹配(除非private
显式派生Sausage
。)