打字稿类型混乱.变量不介意类型

Jim*_*988 2 typescript

如果我有:

var greeter: Greeter = new Sausage();
Run Code Online (Sandbox Code Playgroud)

并且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();
Run Code Online (Sandbox Code Playgroud)

Rya*_*ugh 5

TypeScript使用结构类型系统.即使你没有说Sausage extends Greeter,Sausage它仍然是一个子类型,Greeter因为它至少有所有相同的成员Greeter.请注意,您可以使用a Greeter(访问其greeting属性或调用其greet方法)执行的任何操作都是合法的Sausage.

如果你的方法添加fooGreeter,或删除greeting财产Sausage,例如,代码最后一行将成为一个错误.任何private成员也足以导致结构不匹配(除非Sausage明确派生Greeter).