TypeScript中如何可复用声明类方法的入参类型?
解决方案
一、复用参数类型定义
这里提供两种适配不同场景的实现方式:
1. 改为单对象传参(推荐)
这是工业界最常用的参数复用方案,可读性、可扩展性更强,后续新增参数无需调整参数顺序:
interface MyClassMethodArgs { arg1: string; arg2: number; arg3: number; } interface MyClass { // 直接用定义好的接口注解参数 method1(args: MyClassMethodArgs): void; method2(args: MyClassMethodArgs): void; } // 调用示例:obj.method1({ arg1: 'test', arg2: 1, arg3: 2 })
2. 保留原有多参数形式
如果不想修改现有调用逻辑,要保持三个独立参数的写法,可以把接口转换为参数元组复用:
interface MyClassMethodArgs { arg1: string; arg2: number; arg3: number; } // 从接口生成参数元组,保持参数名和顺序完全一致 type MyClassMethodParams = [arg1: MyClassMethodArgs['arg1'], arg2: MyClassMethodArgs['arg2'], arg3: MyClassMethodArgs['arg3']]; interface MyClass { method1(...args: MyClassMethodParams): void; method2(...args: MyClassMethodParams): void; } // 调用方式和原来完全一致:obj.method1('test', 1, 2)
二、实现类时避免重复写类型
1. 复用已定义的类型
直接用前面定义的MyClassMethodArgs或者MyClassMethodParams注解参数即可:
// 适配单对象传参的实现 class MyClassImpl implements MyClass { method1(args: MyClassMethodArgs) {} method2(args: MyClassMethodArgs) {} } // 适配多参数的实现 // class MyClassImpl implements MyClass { // method1(...args: MyClassMethodParams) {} // method2(...args: MyClassMethodParams) {} // }
2. 直接从接口提取类型(无需额外定义参数类型)
可以用TS内置的Parameters工具类型直接从接口方法中提取参数类型,后续接口修改时实现类类型自动同步:
class MyClassImpl implements MyClass { method1(...args: Parameters<MyClass['method1']>) {} method2(...args: Parameters<MyClass['method2']>) {} }
3. TS 4.9+ 极简写法
如果使用TS 4.9及以上版本,可以通过satisfies运算符约束类类型,无需手动注解参数即可自动继承接口的类型定义:
const MyClassImpl = class implements MyClass { method1(arg1, arg2, arg3) {} method2(arg1, arg2, arg3) {} } satisfies new () => MyClass;
内容的提问来源于stack exchange,提问作者Vergil
相关产品推荐
相关产品推荐

