TypeScript:从Decorator中推断返回类型?

时间:2018-02-22 12:21:54

标签: 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从装饰器中推断出类型?

1 个答案:

答案 0 :(得分:1)

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

有一个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'));

但是我知道这可能与你想要的东西有所不同