打字稿类型混淆。变量不介意类型

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 GreeterSausage 仍然是 Greeter 子类型 ,因为它至少具有 [=] 的所有相同成员12=] 确实如此。请注意,您可以使用 Greeter 执行的任何操作(访问其 greeting 属性 或调用其 greet 方法)对 Sausage.[= 执行都是合法的25=]

如果要将方法 foo 添加到 Greeter,或者从 Sausage 中删除 greeting 属性,例如,最后一行的代码将成为一个错误。任何 private 成员也足以导致结构不匹配(除非 Sausage 明确派生自 Greeter)。