【问题标题】:Type checking and generics类型检查和泛型
【发布时间】:2016-10-10 05:53:04
【问题描述】:

假设我有一个接口:

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 方法提供了不兼容的类型吗?

【问题讨论】:

    标签: javascript generics typescript duck-typing typescript-generics


    【解决方案1】:

    与 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;
         }
    
     } 
    

    【讨论】:

      【解决方案2】:

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

      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}
      

      【讨论】:

        猜你喜欢
        • 2010-11-02
        • 1970-01-01
        • 2011-11-04
        • 1970-01-01
        • 1970-01-01
        • 2018-11-23
        • 2020-09-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多