如何创建仅含选定属性的TypeScript类对象以适配DynamoDB DataMapper?
解决TypeScript类配合DynamoDB DataMapper出现多余映射属性的方案
问题本质
你遇到的问题本质是两种机制的天然冲突:
- TypeScript类在定义时直接给属性赋默认空值的写法,会在运行时给每个
new出来的实例自动挂载所有声明过的属性,哪怕你根本不需要给这些属性赋值 - DynamoDB DataMapper的映射逻辑是扫描类实例的自有可枚举属性,自动匹配需要读写的表字段,这些被自动挂载的空属性就会被当成有效字段,连带写入数据库
这也是你之前用纯JS开发时没有遇到问题的原因——JS类里没有提前给属性加默认赋值,实例上有哪些属性完全由你赋值的内容决定,不会凭空多出字段。
具体解决方法
- 调整类的属性声明方式,从根源上避免自动生成多余实例属性
直接在类定义层给属性赋空字符串默认值是造成多余属性的主要原因,你可以把默认值初始化的逻辑去掉,仅保留类型声明,配合非空断言跳过TS的空值校验:
这时候创建实例只需要给必填属性赋值,未赋值的可选属性不会自动出现在实例的自有属性列表中:class User { // 非空属性:不赋默认值,仅做类型声明 id!: string; displayName!: string; // 可选属性:标注为可选,不做默认值初始化 location?: string; otherAttribute?: string; }// 生成的实例仅包含id、displayName两个自有属性,无多余字段 const userToSave = Object.assign(new User(), { id: "user_001", displayName: "测试用户" }); - 手动清理实例上的多余属性
如果不想修改原有类的定义结构,可以在创建实例后,手动删掉不需要被映射的属性:// 基于原有的带默认值的User类创建实例 const userToSave = new User(); userToSave.id = "user_001"; userToSave.displayName = "测试用户"; // 移除不需要映射的属性,让它们从实例自有属性列表中消失 delete userToSave.location; delete userToSave.otherAttribute; - 用装饰器显式控制DataMapper的映射范围
可以借助DataMapper官方提供的映射装饰器,只给需要参与映射的属性添加显式标记,关闭自动全量扫描类属性的逻辑。这种方式下,哪怕类上存在其他未被标记的属性,DataMapper也不会将它们识别为需要读写的表字段,从映射逻辑上隔离多余属性的影响。
注意事项
不要直接用普通对象字面量冒充User类实例传给DataMapper,该库内部会通过instanceof校验传入的对象是否为对应类的实例,纯字面量对象会触发校验失败。正确做法是始终基于类的原型创建实例,再按需调整实例上的自有属性。
内容的提问来源于stack exchange,提问作者Bryan
相关产品推荐
相关产品推荐

