Effect CommunityEC
Effect Community15mo ago
5 replies
oxcap

Adding computed fields to schema

I'm trying to migrate from Zod to Effect.ts and I'm wondering if maybe there's a simpler way to add a new field to Struct that is created based on the values of other fields.
Zod:
z
  .object({
    firstName: z.string(),
    lastName: z.string(),
    other: z.string(),
  })
  .transform(({ firstName, lastName, ...user }) => ({
    name: `${firstName} ${lastName}`,
    ...user,
  }))


Effect Schema

const userSchema = Schema.Struct({
  firstName: Schema.NonEmptyTrimmedString,
  lastName: Schema.NonEmptyTrimmedString,
  other: Schema.NonEmptyTrimmedString,
})

const transformedSchema = Schema.transform(
  Schema.encodedSchema(userSchema),
  Schema.Struct({
    ...userSchema.fields,
    name: Schema.NonEmptyTrimmedString,
  }),
  {
    decode: ({firstName, lastName, ...user}) => {
      return {
        ...user,
        name: `${firstName} ${lastName}`,
      }
    },
    encode: (n) => {
      return n
    },
  },
)



Am I doing this right? Isn't there a simpler way to do that?
Was this page helpful?