如何在Zod对象中实现等效的getter功能?
在Zod中实现类似ES5对象getter的功能
可以实现,但Zod作为Schema验证库本身不直接支持在对象Schema中定义getter,不过可以通过以下几种方式达成类似效果:
方法1:使用Zod的transform方法
通过transform钩子,在验证通过后返回一个带有getter的新对象,将原数据与自定义getter结合:
import { z } from "zod"; const PersonSchema = z.object({ firstName: z.string(), lastName: z.string() }).transform((data) => ({ ...data, get myName() { return `${this.firstName} ${this.lastName}`; } })); // 验证并生成带getter的对象 const me = PersonSchema.parse({ firstName: "Testy", lastName: "mcTestface" }); console.log(me.myName); // 输出 "Testy mcTestface"
方法2:结合Class与Zod
定义一个包含getter的Class,通过transform将验证后的普通对象转换为Class实例,这样就能直接使用Class中的getter:
import { z } from "zod"; class Person { firstName: string; lastName: string; constructor(data: { firstName: string; lastName: string }) { this.firstName = data.firstName; this.lastName = data.lastName; } get myName() { return `${this.firstName} ${this.lastName}`; } } const PersonSchema = z.object({ firstName: z.string(), lastName: z.string() }).transform(data => new Person(data)); const me = PersonSchema.parse({ firstName: "Testy", lastName: "mcTestface" }); console.log(me.myName); // 输出 "Testy mcTestface"
这两种方式都能实现类似ES5 getter的功能,其中transform是Zod推荐的处理数据转换的方式,既保证了数据验证的严谨性,又能灵活扩展对象的属性行为。
内容的提问来源于stack exchange,提问作者branperr
相关产品推荐
相关产品推荐

