TypeScript旧版实验性装饰器获取方法返回类型遇类型约束错误
解决TypeScript实验性装饰器中获取方法返回类型的类型错误
错误原因
ReturnType<M>工具类型要求类型参数M必须是函数类型,但你定义的TaskProps<T, M>中M没有任何约束,导致TypeScript无法确认M符合ReturnType的使用条件,从而抛出类型错误。
修复方案
给TaskProps的M参数添加函数类型约束,同时优化返回值的类型判断逻辑,确保param只能取被修饰方法返回对象的属性名:
type TaskProps<T, M extends (...args: any[]) => any> = { next: keyof T; param: ReturnType<M> extends Record<string, any> ? keyof ReturnType<M> : string; }; function Task<T, K extends keyof T>(props: TaskProps<T, T[K]>) { return function (target: T, propertyKey: K, descriptor: PropertyDescriptor) { // 装饰器内部可正常使用props.param,它已被约束为目标方法返回值的属性名 }; } class ExampleClass { @Task({ next: "bye", param: "name", // 仅能传入"name"或"age",TypeScript会自动校验 }) hello() { return { name: "example", age: 11 }; } bye() {} }
关键修改说明
- 添加函数类型约束:
M extends (...args: any[]) => any确保M是函数类型,满足ReturnType<M>的使用前提。 - 优化对象类型判断:用
ReturnType<M> extends Record<string, any>替代原有的extends {},避免将基本类型(如string、number)误识别为对象,让类型校验更精准。 - 自动属性名校验:现在
param会被TypeScript自动约束为目标方法返回对象的属性名,输入非法值时会直接报错,提升代码安全性。
内容的提问来源于stack exchange,提问作者Aníbal Jorquera
相关产品推荐
相关产品推荐

