簡體   English   中英

TypeScript:是否等效於C#的通用類型約束來擴展類?

[英]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.

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