如何修改对象属性且避免TypeScript报错?(Zod+SQLite场景)
问题
我使用Zod处理TypeScript类型,现有简化的Zod Schema如下:
export const Event = z .object({ ... subtype: z.array(z.enum(['abc', 'def', 'ghi'])), ... }) export type Event = z.infer<typeof Event>
需要将Event类型对象的subtype数组转为逗号分隔的字符串,以适配不支持数组类型的SQLite,但执行以下代码时出现TypeScript报错:
export const stringify_event = (event: Event) => { event.subtype = event.subtype.join(',') // 报错:Type 'string' is not assignable to type... return event }
求解决该报错并实现属性修改的方法。
解决方法
方法1:创建新对象(推荐)
不要直接修改原对象的类型,而是创建一个包含转换后字段的新对象,同时保留其他属性。这种方式符合类型安全原则,不会破坏原对象的类型:
export const stringify_event = (event: Event) => { return { ...event, subtype: event.subtype.join(',') } satisfies Omit<Event, 'subtype'> & { subtype: string } }
方法2:类型断言(临时方案)
如果必须修改原对象,可以使用类型断言绕过类型检查,但这种方式会降低类型安全性,需谨慎使用:
export const stringify_event = (event: Event) => { (event as Omit<Event, 'subtype'> & { subtype: string }).subtype = event.subtype.join(',') return event as Omit<Event, 'subtype'> & { subtype: string } }
方法3:提前定义转换后的类型
先明确转换后的对象类型,让代码逻辑更清晰:
// 定义适配SQLite的事件类型 type EventForSQLite = Omit<Event, 'subtype'> & { subtype: string } export const stringify_event = (event: Event): EventForSQLite => { return { ...event, subtype: event.subtype.join(',') } }
内容的提问来源于stack exchange,提问作者charnould
相关产品推荐
相关产品推荐

