这个问题与Zod
无关,但我使用这个库来处理我的TS类型。
考虑下面的超简化模式:
export const Event = z
.object({
...
subtype: z.array(z.enum(['abc', 'def', 'ghi']),
...
})
export type Event = z.infer<typeof Event>
不管是什么原因,我想修改一个event
对象如下:
export const stringify_event = (event: Event) => {
event.subtype = event.subtype.join(',') <-- Type 'string' is not assignable to type...
return event
}
我不知道如何消除TS错误。如何“改变”我的事件?谢谢
--编辑--
我做了一个MRE来说明我的问题。
我想“改变”一个属性的原因是因为我使用了SQLite
,它不允许array
。所以在保存事件之前,我需要使它与SQLite
兼容。
2条答案
按热度按时间vmdwslir1#
佐德在我的瞄准镜外。但是似乎你有一个
z.union
方法,你可以在你的Event对象中设置属性subtype: z.union([z.array(z.enum('abc'|'def'|'ghi')), z.string()]
。我猜在typescript端属性子类型将被键入为[“abc”|“def”|“ghi”]|串,
带有属性
Array<string> | string
的MREykejflvf2#
我认为你不应该改变对象,而是创建一个新的对象,因为它们应该是不同的东西:
另一方面,如果你把它们混合在一起(例如:将
another_key
定义为string[] | string
),您将需要在所有地方使用类型保护,以确保它是string[]
或string
,这很烦人如果你想重用这个模式,一个实用程序类型会有帮助:
类型
ToSQL
将所有Array
属性转换为string
,并保持不变。