TypeScript扩展运算符致对象被拆分为单个字符,如何解决?
解决TypeScript中扩展运算符将对象拆分为单个字符的问题
根本原因
你传入createItem的参数不是FleetAccount类型的对象,而是经过HTML转义的JSON字符串。从输出里的"(HTML转义的双引号)和数字索引键就能看出来——当你对字符串使用对象扩展运算符时,JavaScript会把字符串当作类数组对象处理,每个字符对应一个数字索引的键值对,这就是对象被拆成单个字符的原因。
解决方案
1. 修复接口语法错误
你的FleetAccount接口里businessName和createdAt字段缺少类型定义,先补上:
export default interface FleetAccount { id: string; businessName: string; // 补充字段类型 businessAddress: string; abn: string; primaryContactId: string; invoiceIds: Array<string>; availableMerchants: Array<string>; requireVehicleRegistration: boolean; users: Array<string>; createdAt: string; // 补充字段类型 updatedAt: string; }
2. 解析传入的JSON字符串
如果调用方只能传入字符串,在方法内部先将其解析为对象,同时处理HTML转义的字符:
async createItem(item: FleetAccount | string): Promise<FleetAccount> { // 处理字符串输入,转换为对象 let parsedItem: FleetAccount; if (typeof item === 'string') { // 替换HTML转义的双引号为普通双引号 const cleanedJson = item.replace(/"/g, '"'); parsedItem = JSON.parse(cleanedJson) as FleetAccount; } else { parsedItem = item; } const itemToInsert: FleetAccount = { ...parsedItem, id: generateUniqueKey("ACC"), createdAt: new Date().toISOString(), updatedAt: new Date().toISOString(), }; try { await this.docClient.send(new PutCommand({ TableName: this.tableName, Item: itemToInsert, ConditionExpression: 'attribute_not_exists(id)' })); } catch (e) { if (e instanceof ConditionalCheckFailedException) { return Promise.reject("Item with specified Id already exists."); } else { console.log("FAILURE!"); console.log(e); return Promise.reject(); } } return itemToInsert; }
3. 确保调用方传入对象而非字符串
如果调用方本应传入对象,检查调用代码:比如在HTTP服务中,确保使用了body解析中间件(如Express的express.json()),避免直接传递未解析的请求体字符串。
内容的提问来源于stack exchange,提问作者Ezzy C
相关产品推荐
相关产品推荐

