[英]TypeScript: Infer type of <this> in Object extension method
[英]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.