TypeScript子类重写父类方法的简洁实现及类型复用问询
符合DRY原则的TypeScript类方法类型复用方案
1. 为类方法指定可复用类型
要让类方法复用预定义的类型签名,同时保持其类方法特性(而非实例属性),可以通过接口约束或显式类型标注实现:
- 方法一:定义包含方法签名的接口,让类实现该接口,TypeScript会自动校验方法是否符合类型:
type Method = (n: number) => number; interface HasMethod { method: Method; } class A implements HasMethod { // 自动校验参数和返回值符合Method类型 method(n: number) { return n; } }
- 方法二:直接在类方法上标注返回值类型,结合
ReturnType复用预定义类型:
type Method = (n: number) => number; class A { method(n: number): ReturnType<Method> { return n; } }
2. 简化子类重写方法的类型定义
针对复杂参数列表的方法重写,无需手动解构Parameters,直接复用父类方法的类型即可:
class B extends A { // 直接复用父类method的完整类型签名 method: typeof A.prototype.method = function(n) { return n * 2; }; }
这种方式完全复用父类方法的参数、返回值及回调类型,避免重复编写复杂类型,严格遵循DRY原则。
3. satisfies关键字的应用
satisfies用于验证类或方法是否符合指定类型,但不改变原有类型推断,适合需要类型校验但保留类方法多态性的场景:
- 验证类的方法是否符合预定义类型:
type Method = (n: number) => number; class A { method(n: number) { return n; } } // 验证A的method是否匹配Method类型,不修改A的原有类型 type CheckA = A satisfies { method: Method };
- TS 5.2+支持直接在类定义时使用
satisfies,实时校验类结构:
class A satisfies { method: Method } { method(n: number) { return n; } }
完整示例
// 定义复杂的可复用方法类型 type ComplexMethod = ( id: string, options: { enabled: boolean; onComplete: (data: { result: string }) => void } ) => Promise<string>; // 接口约束父类方法 interface ComplexOperation { execute: ComplexMethod; } // 父类实现接口 class BaseService implements ComplexOperation { async execute(id: string, options) { const result = `processed-${id}`; options.onComplete({ result }); return result; } } // 子类复用父类方法类型重写 class EnhancedService extends BaseService { execute: typeof BaseService.prototype.execute = async function(id, options) { const result = `enhanced-processed-${id}`; options.onComplete({ result }); return result; }; } // 用satisfies验证子类类型合规性 type VerifyEnhancedService = EnhancedService satisfies { execute: ComplexMethod };
内容的提问来源于stack exchange,提问作者Alexander Nenashev
相关产品推荐
相关产品推荐

