TypeScript「extends」泛型約束
我正在 TypeScript 中使用 extends 限制,如下所示:
class Animal {}
class Lion extends Animal {}
class Bear extends Animal {}
class ZooKeeper<T extends Animal> {
constructor(p: T = new Animal()) {
}
}
new ZooKeeper(new Animal());
但是 p: T=new Animal() 包含一個錯誤:
類型 'Animal' 無法指定給類型 'T'。
建構子 Animal(): Animal
為什麼,以及我該怎麼做,才能使用 Animal,來取代 Animal 子類型?
來源
答案#1
將你的動物轉型為 T,它就會起作用。
class ZooKeeper<T extends Animal> {
constructor(p: T = <T>new Animal()) {
}
}
根據你自己的評論(給未來的讀者),你也可以這樣做:
class ZooKeeper<T extends Animal> {
constructor(p: T = new Animal() as T) {
}
}
答案#2
你可以直接省略建構函式參數宣告中的賦值,看起來對我來說可以正常編譯。如果你想省略它,甚至可以將參數設為可選。
更新:正如 series0ne 指出的,這個解決方案並沒有在未提供 Animal 實例的情況下提供默認實例!
class ZooKeeper<T extends Animal> {
constructor(p?: T) {
}
}
var zk = new ZooKeeper<Lion>(new Lion());
var zk2 = new ZooKeeper(new Animal());
var zk3 = new ZooKeeper();
ZooKeeper 類別將會被型別化,並且你可以存取 T 的子類別特定屬性。
