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

时间:2015-01-22 01:54:19

标签: typescript

如果我有:

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();

1 个答案:

答案 0 :(得分:5)

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

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