You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用装饰器时出现“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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 11:47:04