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