为何Mikro-ORM返回的数字以字符串形式呈现?
解决Bigint属性返回字符串而非数字的问题
针对你遇到的postsCount属性定义为数字但实际返回字符串的问题,这里有几个可靠的解决方法,能覆盖包括直接返回修改后实体在内的各种场景:
1. 实体类中使用Getter/Setter封装
直接在User实体里通过getter和setter实现类型转换,这样不管是从数据库加载还是手动修改实体后返回,外部访问该属性时都会拿到数字类型:
// 将原始字段设为私有,存储数据库返回的字符串 @Property({ columnType: 'bigint', nullable: false, default: 0 }) private _postsCount: string; // 对外暴露的getter,自动转成数字 get postsCount(): number { return parseInt(this._postsCount, 10); } // 对外暴露的setter,接受数字并转成字符串存储 set postsCount(value: number) { this._postsCount = value.toString(); }
这种方式不需要依赖序列化器,任何访问postsCount的地方都会自动处理类型转换。
2. 使用ORM自带的类型转换器(推荐)
如果使用的是TypeORM、MikroORM这类ORM框架,它们都支持自定义类型转换器,在实体映射阶段自动完成数据库值和实体属性值的转换,属于框架层面的处理,不会被业务代码绕过:
MikroORM示例
// 定义转换器类 class BigIntToNumberConverter { toDatabaseValue(value: number): string { return value.toString(); } toEntityValue(value: string): number { return parseInt(value, 10); } } // 在实体属性上应用转换器 @Property({ columnType: 'bigint', nullable: false, default: 0, converter: new BigIntToNumberConverter() }) postsCount: number;
TypeORM示例
@Column({ type: 'bigint', nullable: false, default: 0, transformer: { // 存到数据库时转成字符串 to: (value: number) => value.toString(), // 从数据库读取时转成数字 from: (value: string) => parseInt(value, 10) } }) postsCount: number;
3. 注意精度问题
如果postsCount的数值可能超过JavaScript Number的精度上限(约9007199254740992),那转成Number会丢失精度,此时建议:
- 保留字符串类型,或者改用
BigInt类型存储和返回 - 前端处理时使用BigInt兼容逻辑
内容的提问来源于stack exchange,提问作者Connor Marble
相关产品推荐
相关产品推荐

