gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 14:24:16 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com