簡體   English   中英

Can Typescript可以推斷出由其基類方法實例化的擴展類實例的類型嗎?

[英]Can Typescript infer the type of an instance of an extension class instantiated by a method of its base?

請考慮以下Typescript片段:

class Animal {
  constructor(name: string) {
    this.name = name;
  }
  name: string;

  haveBaby(name: string): ?? return type ?? {
    return new this.constructor(name); // Error
  }
}

class Cat extends Animal {}
class Dog extends Animal {}
class Gerbil extends Animal {} // etc.

let sorachi = new Cat("Sorachi"); // a: Cat
let sorachiJr = a.haveBaby("Sorachi Jr."); // I want: sorachiJr: Cat

動物可以有嬰兒,嬰兒應該是與父母相同的動物,即,應該是與父母同一類的實例。 如何在這種情況下分配類型,以便Typescript知道sorachiJr: Cat

上面的代碼段不起作用。 return new this.constructor(name)產生錯誤[ts] Cannot use 'new' with an expression whose type lacks a call or construct signature. 在VS Code中。 我能夠找到並理解的唯一解決方案是用(<any>this.constructor)(name)(<any>this).constructor(name)替換this.constructor(name) (<any>this).constructor(name) ,但是后來推斷出sorachiJr的類型也是any ,而不是Cat 我嘗試使用typeof this而不是any ,但得到錯誤[ts] Cannot find name 'this'

我怎么能說服那些有嬰兒的物種保存手術?

保留調用該方法的類的類型很容易,我們只使用this類型的多態。 為了說服constructor將是一個構造函數,它接受一個string並返回一個與當前類相同類型的實例,需要一個類型斷言

type AnimalConstructor<T extends Animal> = new (name: string) => T
class Animal {
    constructor(name: string) {
        this.name = name;
    }
    name: string;

    haveBaby(name: string): this  {
        return new (this.constructor as AnimalConstructor<this>)(name); 
    }
}

class Cat extends Animal {}
class Dog extends Animal {}
class Gerbil extends Animal {} // etc.

let sorachi = new Cat("Sorachi"); // a: Cat
let sorachiJr = sorachi.haveBaby("Sorachi Jr."); 

注意 Typescript無法驗證派生類構造函數只需要單個string參數這一事實,它可能需要更多或更少的參數。 這使得此構造函數不是類型安全的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM