如何解决TypeORM使用TypeScript私有属性的查询报错问题?
TypeORM支持TypeScript私有属性的解决方案
TypeORM完全支持TypeScript私有属性,你遇到的报错是因为查询逻辑或配置不当导致的,下面是具体的解决方法:
检查TypeScript编译配置
确保tsconfig.json中开启了装饰器相关配置,这是TypeORM识别私有属性的前提:{ "compilerOptions": { "experimentalDecorators": true, "emitDecoratorMetadata": true, "target": "ES6", // 或更高版本,保证装饰器特性支持 // 其他编译配置... } }修正查询语句
报错原因是你查询时用了数据库列名name,但类中对应的私有属性是_name,TypeORM查询匹配的是类的属性名而非数据库列名:// 错误写法 await carRepository.findOne({ where: { name: "Tesla" } }); // 正确写法1:使用类的私有属性名 await carRepository.findOne({ where: { _name: "Tesla" } }); // 正确写法2:用QueryBuilder直接指定数据库列名(更灵活) await carRepository.createQueryBuilder("car") .where("car.name = :name", { name: "Tesla" }) .getOne();推荐:用getter/setter封装私有属性
既保留私有属性的封装性,又能通过公共方法安全地访问和修改属性,同时不影响TypeORM的映射:@Entity("Car") export class Car { @Column({ name: "name"}) private _name: string; get name(): string { return this._name; } set name(value: string) { // 可添加自定义验证或修改逻辑 if (!value.trim()) { throw new Error("车辆名称不能为空"); } this._name = value; } // 其他属性和方法... }这样你可以通过
car.name来读写属性,内部私有属性不会被直接修改,完全满足你的需求。
内容的提问来源于stack exchange,提问作者Sabgramar
相关产品推荐
相关产品推荐

