typescript 如何使zod schame的某些属性可选

ht4b089n  于 2023-03-19  发布在  TypeScript
关注(0)|答案(1)|浏览(153)
const schema = z.object({
    id: z.string(),
    name: z.string(),
});

其等价物

type schema = {
    id: string;
    name: string;
}

我的问题是,我必须使一些属性可选,但保持这样的类型

type schema = {
    id?: string;
    name: string;
}

如果使用.optional(),则所有属性都是可选
目的是,我需要从数据库返回schema,这样id就不是空pk。
案例:我有upsert方法

// Insert value not working
const schemaInput = schema.parse({ name: 'My Name' });

// Update value is working
const schemaInput = schema.parse({ id: '123', name: 'My Name' });

user.upsert({ ...schemaInput, id: schemaInput?.id || generateId() })

但是每次我执行这个方法时,zod解析器总是显示一个错误

{
    "expected": "string",
    "received": "undefined",
    "path": [
      "id"
    ],
}
xzlaal3s

xzlaal3s1#

你只需要把这个属性的值设置为可选的,当这个值被用作对象属性时,Zod会注意到这一点,并把这个属性设置为可选的。

const schema = z.object({
    id: z.string(),
    name: z.string().optional(),
});

const value = schema.parse({ name: 'abc' })
// value has type { id: string, name?: string | undefined }

见Playground

相关问题