类型检查和泛型
Type checking and generics
假设我有一个接口:
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一样,TypeScript 使用鸭子类型。因此,在您的示例中,矩形和圆形是相同的。
一旦这些 类 添加了它们自己的实现,duck typing 就会失败并且 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;
}
}
因为您的 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}
假设我有一个接口:
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一样,TypeScript 使用鸭子类型。因此,在您的示例中,矩形和圆形是相同的。
一旦这些 类 添加了它们自己的实现,duck typing 就会失败并且 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;
}
}
因为您的 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}