You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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() {}
}

关键修改说明

  1. 添加函数类型约束:M extends (...args: any[]) => any确保M是函数类型,满足ReturnType<M>的使用前提。
  2. 优化对象类型判断:用ReturnType<M> extends Record<string, any>替代原有的extends {},避免将基本类型(如string、number)误识别为对象,让类型校验更精准。
  3. 自动属性名校验:现在param会被TypeScript自动约束为目标方法返回对象的属性名,输入非法值时会直接报错,提升代码安全性。

内容的提问来源于stack exchange,提问作者Aníbal Jorquera

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 05:42:35