使用装饰器时出现“Property 'id' does not exist on type 'Person'”错误求助
解决TypeScript装饰器添加属性后的类型报错问题
核心原因是TypeScript编译时类型系统无法自动识别装饰器在运行时给类添加的属性,和tsconfig.json的target配置无关(该配置仅控制编译输出的JS版本)。以下是几种可行的解决方法:
方法1:合并类接口补充属性
利用TypeScript的接口合并特性,给Person类声明同名接口,手动添加id的类型定义:
// 定义装饰器 function DefaultParameterValue(target: typeof Person) { target.prototype.id = 123; } @DefaultParameterValue class Person {} // 合并接口,补充id属性的类型 interface Person { id: number; } // 此时访问p.id不会报错 const p = new Person(); console.log(p.id);
方法2:使用类型断言临时扩展类型
如果不想修改全局接口,可以在实例化时用类型断言,临时给实例添加id的类型:
@DefaultParameterValue class Person {} const p = new Person() as Person & { id: number }; console.log(p.id);
方法3:重构装饰器为类继承式(更规范的类型友好写法)
将装饰器改为返回一个继承原类的新类,让TypeScript自动推导新类的类型(包含新增的id属性):
// 定义构造函数类型 type Constructor<T = {}> = new (...args: any[]) => T; // 装饰器返回继承原类的新类,自动携带id属性 function DefaultParameterValue<T extends Constructor>(target: T) { return class extends target { id = 123; }; } // 这里Person的类型会自动包含id const Person = DefaultParameterValue(class Person {}); const p = new Person(); console.log(p.id); // 无类型报错
内容的提问来源于stack exchange,提问作者Danilo Henrique
相关产品推荐
相关产品推荐

