打字稿类型混淆。变量不介意类型
Typescript type confusion. Variable doesn't mind type
如果我有:
var greeter: Greeter = new Sausage();
Greeter
class 和 Sausage
class 具有相同的功能和属性,变量 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();
TypeScript 使用结构类型系统。即使您没有说 Sausage extends Greeter
,Sausage
仍然是 Greeter
的 子类型 ,因为它至少具有 [=] 的所有相同成员12=] 确实如此。请注意,您可以使用 Greeter
执行的任何操作(访问其 greeting
属性 或调用其 greet
方法)对 Sausage
.[= 执行都是合法的25=]
如果要将方法 foo
添加到 Greeter
,或者从 Sausage
中删除 greeting
属性,例如,最后一行的代码将成为一个错误。任何 private
成员也足以导致结构不匹配(除非 Sausage
明确派生自 Greeter
)。
如果我有:
var greeter: Greeter = new Sausage();
Greeter
class 和 Sausage
class 具有相同的功能和属性,变量 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();
TypeScript 使用结构类型系统。即使您没有说 Sausage extends Greeter
,Sausage
仍然是 Greeter
的 子类型 ,因为它至少具有 [=] 的所有相同成员12=] 确实如此。请注意,您可以使用 Greeter
执行的任何操作(访问其 greeting
属性 或调用其 greet
方法)对 Sausage
.[= 执行都是合法的25=]
如果要将方法 foo
添加到 Greeter
,或者从 Sausage
中删除 greeting
属性,例如,最后一行的代码将成为一个错误。任何 private
成员也足以导致结构不匹配(除非 Sausage
明确派生自 Greeter
)。