youtobelxz 2025-03-11 10:50 采纳率: 45.8%
浏览 18

typesript 方法装饰器descriptor参数获取不到value


function Logger(target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor) {
    console.log('target:',  target);
    console.log('propertyKey:',  propertyKey);
    console.log('descriptor:',  descriptor);

 
    const original = descriptor.value;  // 缓存原始方法 
    descriptor.value  = function (...args: any[]) {
        console.log(`${propertyKey.toString()}  开始`);
        original.call(this,  ...args);
        console.log(`${propertyKey.toString()}  结束`);
    };
}
 
class Person9 {
    @Logger 
    speak() {
        console.log(this.name,  this.age); 
    }
    
    constructor(public name: string, public age: number) {
        this.name  = name;
        this.age  = age;
    }
}
 
// 测试 
const per9 = new Person9('Alice', 12);
per9.speak(); 

img


descriptor 获取不到value

  • 写回答

5条回答 默认 最新

  • 宝码香车 优质创作者: JavaScript技术领域 2025-03-11 12:02
    关注
    让【宝码香车】来帮你解答,本回答参考DeepSeek编写,并整理提供,如果还有疑问可以点击头像关注私信或评论。
    如果答案让您满意,请采纳、关注,非常感谢!

    在 TypeScript 中,方法装饰器的 descriptor 参数应该包含 value 属性,该属性指向被装饰的方法。然而,如果你发现 descriptor 参数中没有 value 属性,可能是因为你在使用装饰器时遇到了一些问题。

    以下是一些可能的原因和解决方案:

    1. 装饰器的使用方式

    确保你正确地使用了装饰器。装饰器应该直接放在方法的上方,并且方法应该是类的实例方法。

    class Person9 {
        @Logger
        speak() {
            console.log(this.name, this.age);
        }
    
        constructor(public name: string, public age: number) {
            this.name = name;
            this.age = age;
        }
    }
    

    2. 装饰器的定义

    确保你的装饰器函数正确地处理了 descriptor 参数。descriptor 应该是一个 PropertyDescriptor 对象,其中包含 value 属性。

    function Logger(target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor) {
        console.log('target:', target);
        console.log('propertyKey:', propertyKey);
        console.log('descriptor:', descriptor);
    
        const original = descriptor.value;  // 缓存原始方法
    
        descriptor.value = function (...args: any[]) {
            console.log(`${propertyKey.toString()}  开始`);
            original.call(this, ...args);
            console.log(`${propertyKey.toString()}  结束`);
        };
    }
    

    3. TypeScript 配置

    确保你的 TypeScript 配置 (tsconfig.json) 中启用了装饰器支持。你需要在 tsconfig.json 中启用 experimentalDecorators 选项。

    {
      "compilerOptions": {
        "experimentalDecorators": true,
        "emitDecoratorMetadata": true
      }
    }
    

    4. 检查 TypeScript 版本

    确保你使用的 TypeScript 版本支持装饰器。装饰器是 TypeScript 的一个实验性特性,虽然大多数现代版本都支持,但如果你使用的是非常旧的版本,可能会遇到问题。

    5. 检查代码的其他部分

    确保你的代码中没有其他部分影响了装饰器的行为。例如,确保 Person9 类的定义和实例化都是正确的。

    6. 调试

    如果以上步骤都没有解决问题,可以尝试在装饰器中添加更多的调试信息,看看 descriptor 对象中到底包含了什么。

    function Logger(target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor) {
        console.log('target:', target);
        console.log('propertyKey:', propertyKey);
        console.log('descriptor:', descriptor);
    
        if (!descriptor || !descriptor.value) {
            console.error('Descriptor or descriptor.value is missing');
            return;
        }
    
        const original = descriptor.value;  // 缓存原始方法
    
        descriptor.value = function (...args: any[]) {
            console.log(`${propertyKey.toString()}  开始`);
            original.call(this, ...args);
            console.log(`${propertyKey.toString()}  结束`);
        };
    }
    

    7. 使用 Babel 或其他工具

    如果你在使用 Babel 或其他工具进行转译,确保这些工具也支持 TypeScript 的装饰器语法。

    总结

    如果你按照上述步骤检查并确保一切配置正确,descriptor 参数应该能够正确获取到 value 属性。如果问题仍然存在,建议提供一个更完整的代码示例或错误信息,以便进一步诊断问题。

    评论

报告相同问题?

问题事件

  • 创建了问题 3月11日