Coder Social home page Coder Social logo

Comments (2)

jviide avatar jviide commented on May 16, 2024 1

I think this can be achieved with Valita's builtin features by using the strict parsing mode and inferring the Parent and Child types from the final parser:

const Parent = v.object({
  children: v
    .record(
      v.object({
        color: v.string(),
      })
    )
    .map((children) =>
      Object.fromEntries(
        Object.entries(children).map(([name, child]) => [
          name,
          { name, ...child },
        ])
      )
    ),
});

type Parent = v.Infer<typeof Parent>;
type Child = Parent["children"][string];

const example = Parent.parse(someInput, { mode: "strict" });

The strict mode makes Valita fail parsing when it encounters an unexpected object key:

Parent.parse(
  {
    children: { alice: { color: "blue", name: "bob" } },
  },
  { mode: "strict" }
);
// ValitaError: unrecognized_key at .children.alice (unrecognized key "name")

In fact, since Valita v0.0.21 released yesterday, the strict mode is the default (the old behavior can be enabled by setting { mode: "passthrough" }):

Parent.parse({
  children: { alice: { color: "blue", name: "bob" } },
});
// ValitaError: unrecognized_key at .children.alice (unrecognized key "name")

It's also possible for v.object to "opt-in" to strict parsing regardless of the parsing mode:

      // fail parsing if "name" is present.
      v.object({
        color: v.string(),
        name: v.never().optional()
      })

or

      // fail parsing if "color" is not the only key present
      v.object({
        color: v.string(),
      })
      .rest(v.never())

from valita.

jviide avatar jviide commented on May 16, 2024

I'm assuming this was solved, so closing this issue 👍

from valita.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.