TypeScript:从装饰器推断返回类型?

2024-02-28

当装饰器更改其返回类型时,如何让 TypeScript 推断装饰方法的类型?

在下面的基本示例中,我装饰一个方法以返回字符串化对象:

function jsonStringify() {
  return function (target, decoratedFnName: string, descriptor: PropertyDescriptor) {
    let decoratedFn = descriptor.value;

    let newFn = function () {
      let object = decoratedFn.apply(target, arguments);

      return JSON.stringify(object);
    };

    descriptor.value = newFn;

    return descriptor;
  }
}

class Decorated {
  @jsonStringify()
  method(name: string, description: string) {
    return {
      name: name,
      description: description
    }
  }
};

let stringifiedObject = new Decorated().method('Test Name', 'Test Description');

console.log(stringifiedObject.includes('Test Name'));

如果我使用以下命令转译 TypeScript"noEmitOnError": false在 tsconfig.json 中,代码完美运行并将 true 记录到控制台。然而,tsc 抱怨错误:

error TS2339: Property 'includes' does not exist on type '{ name: string; description: string; }'.

我明白是因为Decorated.method()返回一个对象而不是字符串,但此方法有一个返回字符串的装饰器。我需要做什么才能让 TypeScript 从装饰器推断类型?


目前不支持使用装饰器更改函数的返回类型。

有一个github 上的开放问题跟踪此问题 https://github.com/Microsoft/TypeScript/issues/4881

作为替代方案,您也许可以这样做:

class Decorated {
  @jsonStringify()
  method(name: string, description: string): string | object {
    return {
      name: name,
      description: description
    };
  }
}

const stringifiedObject = new Decorated().method('Test Name', 'Test Description') as string;

console.log((stringifiedObject as string).includes('Test Name'));

但我认识到这可能与您正在寻找的内容有点背离

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TypeScript:从装饰器推断返回类型? 的相关文章

随机推荐