如何在子类方法中返回不同类型?TypeScript类继承问题
解决方案:让子类方法返回不同类型的正确方式
问题原因
当前代码报错是因为SuperClass继承HasMethod时未显式指定泛型参数,TypeScript自动推断HasMethod的泛型T为{ foo: string }。当SubClass继承SuperClass后,重写的implementMe方法必须返回与父类兼容的类型(即{ foo: string }的子类型),但{ north: string }和该类型无继承关系,因此触发类型不兼容错误。
可行方案
方案1:子类直接继承抽象类并指定专属泛型类型
如果SubClass不需要继承SuperClass的其他逻辑,可让每个子类直接继承HasMethod并声明自己的返回类型:
abstract class HasMethod<T = any> { abstract implementMe(): T; } // 父类指定自己的返回类型 class SuperClass extends HasMethod<{ foo: string }> { implementMe() { return { foo: 'bar' }; } } // 子类指定自己的返回类型 class SubClass extends HasMethod<{ north: string }> { implementMe() { return { north: 'star' }; } }
方案2:让父类成为泛型类,子类继承时覆盖泛型参数
如果SubClass必须继承SuperClass的其他功能,可将SuperClass改为泛型类,允许子类指定自己的返回类型:
abstract class HasMethod<T = any> { abstract implementMe(): T; } // 父类定义泛型参数,默认值为自身返回类型 class SuperClass<T = { foo: string }> extends HasMethod<T> { implementMe(): T { // 使用类型断言适配泛型,注意运行时类型安全 return { foo: 'bar' } as T; } } // 子类继承时指定自己的返回类型 class SubClass extends SuperClass<{ north: string }> { implementMe() { return { north: 'star' }; } }
适配实际场景(getGraphData序列化)
针对每个实体需要不同序列化逻辑的场景,推荐使用方案1,让每个实体类继承抽象类并声明自己的序列化返回类型:
abstract class Entity { abstract getGraphData(): Record<string, any>; } class UserEntity extends Entity { getGraphData() { return { userId: 1, username: 'alice' }; } } class OrderEntity extends Entity { getGraphData() { return { orderId: 100, total: 99.9 }; } }
这样每个实体的getGraphData方法可以返回各自专属的序列化结构,TypeScript会正确进行类型检查。
内容的提问来源于stack exchange,提问作者Alexander Mills
相关产品推荐
相关产品推荐

