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

标签 typescript typescript-typings

当装饰器更改其返回类型时,如何让 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'));

如果我在 tsconfig.json 中使用 "noEmitOnError": false 转译 TypeScript,那么代码会完美运行并将 true 记录到控制台。然而,tsc 提示错误:

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

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

最佳答案

目前不支持通过装饰器改变函数的返回类型。

有一个open issue on github tracking this

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

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'));

但我知道这可能与您要找的东西有点偏离

关于TypeScript:从装饰器推断返回类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48927311/

相关文章:

javascript - 函数返回值中的部分类型不如预期的那么严格

angular - ngx-toastr ToastrService.show() 类型参数 Angular 2 +

arrays - 在其类型签名中指定数组的长度

typescript - 如何组织一个项目来共享代码?

javascript - 在对象数组中查找最大值

typescript - 我需要帮助引用在 NestJs 的 @Schema 属性中声明的 id

TypeScript:定义了解子类属性的父类构造函数

typescript -///<reference types ="node"/> 是什么意思?

typescript - 在 TypeScript 中动态提取类型

typescript 不能将 'new' 与类型缺少调用或构造签名的表达式一起使用