[英]TypeScript: Equivalent of C#'s Generic Type Constraint for extending class?
我正在嘗試編寫一個受保護的抽象類,該類可以將子類類型作為超類構造函數的方法簽名中的類型參數。
我要查找的內容類似於C#的“通用類型約束”( where
關鍵字),因此我可以在參數列表中使用子類型。
// where T : <base class name>
BaseAuthController<T> where T : BaseAuthController
當前超類
export abstract class BaseAuthController {
protected constructor(
protected dialogRef:
//This class shouldn't know about child classes
MatDialogRef<Child1DialogComponent> |
MatDialogRef<Child2DialogComponent> |
MatDialogRef<Child3DialogComponent>
) {
}
}
當前子類
export class Child1DialogComponent extends BaseAuthController {
constructor(dialogRef: MatDialogRef<Child1DialogComponent>) {
super(dialogRef);
}
}
理想超類
export abstract class BaseAuthController<T> {
protected constructor(protected dialogRef: MatDialogRef<T>) {
}
}
參考
我認為您可能需要自我約束的泛型:
export abstract class BaseAuthController<T extends BaseAuthController<T>> {
protected constructor(protected dialogRef: MatDialogRef<T>) {}
}
此行為通常在具有多態this
類型的 TypeScript中完成,但是您不能在構造函數中引用this
類型。 關於此有一個開放的問題,但看起來不會很快解決。 幸運的是,您仍然可以像Java一樣進行操作 。 並且您的子類應該可以正常工作:
export class Child1DialogComponent extends BaseAuthController<Child1DialogComponent> {
constructor(dialogRef: MatDialogRef<Child1DialogComponent>) {
super(dialogRef);
}
}
希望能有所幫助; 祝好運!
當然,它在操作上有根本的不同,但是有一種方法可以達到相同的結果:
export abstract class BaseAuthController<T extends SubClass> {
protected constructor(protected dialogRef: MatDialogRef<T>) {
}
}
結合統一類型意味着我們可以指定多個子代:
export abstract class BaseAuthController<T extends SubClass1 | SubClass2> {
protected constructor(protected dialogRef: MatDialogRef<T>) {
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.