網站搜尋

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 的子類別特定屬性。