2017-09-06 220 views
0

我有這樣一個簡單的類,我試圖用類屬性(在這種情況下,狗)約束我的類內的對象的類型。我期望在這裏看到編譯錯誤box.put(貓),因爲我通過了錯誤的類型,但不幸的是,我看不到任何。TypeScript不檢測泛型類

class Box<T>{ 
    content: Array<T> = []; 

    put(animal: T){ 
     this.content.push(animal); 
    } 
} 

var dog = new Dog(); 
var cat = new Cat(); 

var box = new Box<Dog>(); 
box.put(cat); 

回答

4

Typescript使用結構兼容性來確定類型兼容性。所以給你的代碼,如果DogCat這些定義

class Dog{ name: string } 
class Cat{ name: string; lives: number } 

您的代碼將工作,因爲CatDog所有領域,因此兼容。

如果您定義的類是這樣的:

class Dog{ name: string; isAsGoodBoy: boolean } 
class Cat{ name: string; lives: number } 

您的代碼將不再起作用,因爲Dog有場Cat沒有。

如果您熟悉Javascript,可以考慮一下它的一個有用的方法是結構類型是duck typing的編譯時版本。

+0

謝謝你這麼好的解釋。 – zdimon77

+0

@ zdimon77很高興幫助,不要忘記標記爲已回答:) –