TypeScript:相当于 C# 的用于扩展类的通用类型约束?

Posted

技术标签:

【中文标题】TypeScript:相当于 C# 的用于扩展类的通用类型约束?【英文标题】:TypeScript: Equivalent of C#'s Generic Type Constraint for extending class? 【发布时间】:2019-01-01 13:44:51 【问题描述】:

我正在尝试编写一个受保护的抽象类,它可以将子类类型作为超类构造函数的方法签名中的类型参数。

我正在寻找类似于 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>) 

    

参考文献

C# Generic Type Constraint Reference TypeScript Generics Reference Possibly related SO Post

【问题讨论】:

【参考方案1】:

当然,它在操作上是完全不同的,但有一种方法可以达到相同的结果:

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>) 

    

【讨论】:

感谢您的回复,但我认为这并不能解决我试图摆脱的根本问题,即父类必须了解每个子类【参考方案2】:

我认为您可能想要自界泛型:

export abstract class BaseAuthController<T extends BaseAuthController<T>> 
  protected constructor(protected dialogRef: MatDialogRef<T>) 

这种行为通常在 TypeScript 中使用polymorphic this types 完成,但您不能在构造函数中引用this 类型。有一个open issue about this,但看起来不会很快解决。幸运的是,您仍然可以do it the way Java does。你的子类应该可以正常工作:

export class Child1DialogComponent extends BaseAuthController<Child1DialogComponent> 
  constructor(dialogRef: MatDialogRef<Child1DialogComponent>) 
    super(dialogRef);
  

希望有所帮助;祝你好运!

【讨论】:

我目前正在尝试这种方法。这看起来很有希望。谢谢你:)

以上是关于TypeScript:相当于 C# 的用于扩展类的通用类型约束?的主要内容,如果未能解决你的问题,请参考以下文章

C#反射实例化类并调用类的方法

TypeScript入门-基本数据类型

13-TypeScript单例模式

1.初步认识TypeScript

转载:TypeScript 简介与《TypeScript 中文入门教程》

转职成为TypeScript程序员的参考手册