9

假设我有一个界面:

interface Comparable<T> {
    equals(other:T):boolean
}

然后我在几个类中实现:

class Rectangle implements Comparable<Rectangle> {

    equals(other:Rectangle):boolean {
        // logic
        return true;
    }

}

class Circle implements Comparable<Circle> {

    equals(other:Circle):boolean {
        // logic
        return true;
    }

}

为什么 TypeScript 允许比较矩形和圆形?

let circle:Circle = new Circle();
let rectangle:Rectangle = new Rectangle();
console.log( circle.equals(rectangle) );

它不应该警告我我为 circle 的equals方法提供了不兼容的类型吗?

4

2 回答 2

9

与 JavaScript 一样,TypeScript 使用鸭式类型。因此,在您的示例中,矩形和圆形是相同的。

一旦这些类添加了自己的实现,鸭子类型就会失败,TypeScript 编译器会给你错误。

class Rectangle implements Comparable<Rectangle> {

     width: number;
     height: number;

     equals(other:Rectangle): boolean {
         // logic
         return true;
     }

}

class Circle implements Comparable<Circle> {

    diameter: number;

    equals(other:Circle): boolean {
         // logic
         return true;
     }

 } 
于 2016-06-09T14:21:23.243 回答
6

因为您的 Rectangle 和 Circle 在结构上是相同的,TypeScript 将它们视为可互换的类型(请参阅“duck typing”)。只需通过向它们添加一些相互不兼容的属性来充实你的圆形和矩形:

class Rectangle implements Comparable<Rectangle> {
    x: number;
    equals(other:Rectangle):boolean {return true;}
}
class Circle implements Comparable<Circle> {
    rad: number;
    equals(other:Circle):boolean {return true;}
}

你会看到错误出现。顺便说一句,这与您可以将对象文字分配给 Circle 类型的 var 的原因相同,只要它具有正确的属性:

var c: Circle = {rad: 1, equals: () => true}
于 2016-06-09T14:21:51.827 回答