-
-
Notifications
You must be signed in to change notification settings - Fork 222
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add content to intersections guide on website
- Loading branch information
1 parent
5812544
commit 8ff2166
Showing
2 changed files
with
48 additions
and
5 deletions.
There are no files selected for viewing
41 changes: 40 additions & 1 deletion
41
website/src/routes/guides/(schemas)/intersections/index.mdx
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,9 +1,48 @@ | ||
--- | ||
title: Intersections | ||
description: >- | ||
An intersection represents a logical AND relationship. You can apply this | ||
concept to your schemas with intersect and partially with merge. | ||
contributors: | ||
- fabian-hiller | ||
--- | ||
|
||
import { Link } from '@builder.io/qwik-city'; | ||
|
||
# Intersections | ||
|
||
> The content of this page is not yet ready. Check back in a few days. | ||
An intersection represents a logical AND relationship. You can apply this concept to your schemas with <Link href="/api/intersect/">`intersect`</Link> and partially with <Link href="/api/merge/">`merge`</Link>. For simple object schemas I recommend <Link href="/api/merge/">`merge`</Link> and in all other cases <Link href="/api/intersect/">`intersect`</Link>. | ||
|
||
## Intersect schema | ||
|
||
The schema function <Link href="/api/intersect/">`intersect`</Link> creates an AND relationship between any number of schemas that you pass as the first argument in the form of an array. To pass the validation, the validation of each schema passed must be successful. If this is the case, the schema merges the output of the individual schemas and returns the result. If the validation fails, the schema returns any issues that occurred. | ||
|
||
```ts | ||
import * as v from 'valibot'; | ||
|
||
// TypeScript | ||
type Intersect = { foo: string } & { bar: number }; | ||
|
||
// Valibot | ||
const IntersectSchema = v.intersect([ | ||
v.object({ foo: v.string() }), | ||
v.object({ bar: v.number() }), | ||
]); | ||
``` | ||
|
||
## Merge method | ||
|
||
Technically, there is a big difference between <Link href="/api/intersect/">`intersect`</Link> and <Link href="/api/merge/">`merge`</Link>. <Link href="/api/intersect/">`intersect`</Link> is a schema function that executes the passed schemas during validation. In contrast, <Link href="/api/merge/">`merge`</Link> is a <Link href="../methods/">method</Link> that merges the entries of the given object schemas during initialization to create a new object schema. | ||
|
||
As a result, <Link href="/api/merge/">`merge`</Link> usually has better performance than <Link href="/api/intersect/">`intersect`</Link> when validating unknown data. Also, subsequent object properties overwrite the previous ones. This is not the case with <Link href="/api/intersect/">`intersect`</Link>, since the validation would fail if two properties with the same name are fundamentally different. However, this also means that the `pipe` and `rest` parameter of the passed object schemas must be ignored and redefined. | ||
|
||
```ts | ||
import * as v from 'valibot'; | ||
|
||
const ObjectSchema = v.merge([ | ||
v.object({ foo: v.string(), baz: v.number() }), | ||
v.object({ bar: v.string(), baz: v.boolean() }), | ||
]); // { foo: string; bar: string; baz: boolean; } | ||
``` | ||
|
||
In the previous code example, the `baz` property of the first object schema is overwritten by the `baz` property of the second object schema. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters