Comments (2)
Hi @ThomasAribart! Thanks for the reply and info shared, much appreciated. I agree with your points and it makes sense.
In our use case we ended up defining 2 separate schemas, one for the "dog" and another for the "cat" in this example. And within our logic we had a switch/case that used one schema or the other for some validation. As for the type generated, we just applied the condition from our end like...
type FinalType =
| FromSchema<typeof dogSchema>
| FromSchema<typeof catSchema>
Which for our use case ended up working nicely, and we didn't have to use the parseIfThenElseKeywords
which was causing some TS compilation issues in some of our larger schemas (as you mention in your docs, it sometimes got aborted due to complexity).
However, we are still refactoring a big part of our application to TS, so the info above is helpful in case we face a similar scenario down the line.
Thanks again for the great work! Finding this library very useful 🎉
from json-schema-to-ts.
Hi @jfarre90 and thanks for the reach out !
This is a tricky one: properties
/ additionalProperties
/ required
from parent & child schemas behave separately and are not to be merged. See https://json-schema.org/understanding-json-schema/reference/object#extending
What FromSchema
does is actually to intersect the two allOf
cases but with those keywords reset to their default values (see this line of code), and then to the rest of the parent schema.
So it compute the intersection of those schemas:
- 1st child schema:
{
type: "object",
properties: {},
required: [],
additionalProperties: true,
if: ... (cat),
then ... (cat)
}
- 2nd child schema:
{
type: "object",
properties: {},
required: [],
additionalProperties: true,
if: ... (dog),
then ... (dog)
}
- Parent schema:
{
type: "object",
properties: {
animal,
...
},
required: ["animal",...]
}
The pb is that the first two schemas, taken independently, are not mutually exclusive because the animal
property can have any value.
If you add it to the child schemas, it will actually work!
const configTest = {
type: "object",
properties: {
animal: { $ref: "#/$defs/animal" },
dynamicProperty: {},
},
additionalProperties: false,
allOf: [
{
properties: {
animal: { $ref: "#/$defs/animal" },
},
if: {
properties: {
animal: { const: "cat" },
},
},
then: {
properties: {
dynamicProperty: {
type: "object",
properties: {
key1: { type: "string" },
},
required: ["key1"],
additionalProperties: false,
},
},
},
},
{
properties: {
animal: { $ref: "#/$defs/animal" },
},
if: {
properties: {
animal: { const: "dog" },
},
},
then: {
properties: {
dynamicProperty: {
type: "null",
},
},
},
},
],
required: ["animal", "dynamicProperty"],
$defs: {
animal: { enum: ["cat", "dog"] },
},
} as const;
type CONFIGTEST = FromSchema<
typeof configTest,
{ parseIfThenElseKeywords: true }
>;
What I'm sure of is that properties cannot naively be merged from child to parent schemas. Still, I'm not sure resetting all properties is the best approach 🤷♂️ WDYT ?
from json-schema-to-ts.
Related Issues (20)
- Dynamically create a schema from a function HOT 1
- Simplest generic function doesn't work, because "too complex"? HOT 2
- Performance Issues with Generics HOT 2
- Definitons in references not resolved
- Properties with const are not typed as const. HOT 2
- Can no longer import JSONSchema7 HOT 1
- Types not resolving correctly after 2.9.2 HOT 3
- Getting `unknown` as result type HOT 1
- JSDoc sees type as never when marking some properties as required HOT 3
- Question: Is there a way to combine or use FromSchema with imported JSON schema
- $ref on definition and additionalProperties: false together results to never type HOT 1
- [Feature] add support for `dependencies` keyword
- Support Draft 2020-12 changes to items and additionalItems
- TypeScript error when using `nullable` in a definition schema HOT 2
- ...unknown[] for objects of array HOT 1
- allOf operator and ajv-keywords support 2
- Issue: Excessive Nesting and Long Queries Prevent Utilization of Library with Generics HOT 2
- supporting 1 or more values of an enum in a querystring variable HOT 1
- Inconsistent type inference for `additionalProperties` when `properties` is also defined HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from json-schema-to-ts.