能否强制实例方法返回自身类的构造函数(以typeof为返回类型)?
强制实例方法返回自身类的构造函数类型
要实现子类必须返回自身构造函数类型的约束,可以通过调整抽象类的方法返回类型为typeof this,利用TypeScript的多态this类型特性来强制子类匹配自身类型。
修正后的代码实现
abstract class AnAbstractClass { // 抽象方法返回当前实例所属类的构造函数类型 abstract getOwnTypeof(): typeof this; } class C1 { getOwnTypeof(): typeof C1 { return C1; } static sm1() {} } class C2 extends AnAbstractClass { // 必须返回typeof C2,否则类型检查报错 getOwnTypeof(): typeof C2 { return C2; } static sm1() {} } let c2 = new C2; c2.getOwnTypeof().sm1(); // 类型正常识别,可调用C2的静态方法sm1
约束效果
如果子类错误地指定了其他类的构造函数类型(比如写成typeof C1),或者返回了错误的构造函数,TypeScript会直接抛出类型不匹配的错误:
class BadC2 extends AnAbstractClass { // 报错:Type 'typeof C2' is not assignable to type 'typeof C1' getOwnTypeof(): typeof C1 { return C2; } }
原理说明
typeof this在实例方法中是多态类型,它会根据当前实例的实际类来动态解析类型。在抽象类中定义这个返回类型后,所有子类必须返回自身的构造函数类型才能满足类型约束,从而实现你需要的强制效果。
内容的提问来源于stack exchange,提问作者rplaurindo
相关产品推荐
相关产品推荐

