Comments (2)
@cmcnicholas Hi,
Unfortunately, structuredClone
won't clone the Symbol
properties TypeBox uses to compose, compile and check types. However you can use TypeBox's CloneType
function to perform a deep clone of a type.
import { Type, CloneType } from "@sinclair/typebox"; // added
import { TypeCompiler } from "@sinclair/typebox/compiler";
// database model
const LettersDbModel = Type.Any([Type.Literal("A"), Type.Literal("B")]);
// a web model we want to expose, derived from db model (in this case they are identical)
const LettersWebModel = CloneType(LettersDbModel);
// const LettersWebModel = { ...LettersDbModel }; // this works?
console.log(LettersWebModel)
// a web model we want to expose
const SomeWebModel = Type.Object({
letter: LettersWebModel,
});
// UPDATE: This line should succeed as the compositing symbols are preserved
const SomeWebModelCompiled = TypeCompiler.Compile(SomeWebModel);
console.log(
"should be false",
SomeWebModelCompiled.Check({
letter: "C",
})
);
console.log(
"should be true",
SomeWebModelCompiled.Check({
letter: "B",
})
);
Also as an aside, it looks like the LettersDbModel
may be incorrect...
const LettersDbModel = Type.Any([Type.Literal("A"), Type.Literal("B")]);
// did you mean?
const LettersDbModel = Type.Union([Type.Literal("A"), Type.Literal("B")]); ??
Hope this helps
S
from typebox.
@cmcnicholas Hi,
Unfortunately,
structuredClone
won't clone theSymbol
properties TypeBox uses to compose, compile and check types. However you can use TypeBox'sCloneType
function to perform a deep clone of a type.import { Type, CloneType } from "@sinclair/typebox"; // added import { TypeCompiler } from "@sinclair/typebox/compiler"; // database model const LettersDbModel = Type.Any([Type.Literal("A"), Type.Literal("B")]); // a web model we want to expose, derived from db model (in this case they are identical) const LettersWebModel = CloneType(LettersDbModel); // const LettersWebModel = { ...LettersDbModel }; // this works? console.log(LettersWebModel) // a web model we want to expose const SomeWebModel = Type.Object({ letter: LettersWebModel, }); // UPDATE: This line should succeed as the compositing symbols are preserved const SomeWebModelCompiled = TypeCompiler.Compile(SomeWebModel); console.log( "should be false", SomeWebModelCompiled.Check({ letter: "C", }) ); console.log( "should be true", SomeWebModelCompiled.Check({ letter: "B", }) );Also as an aside, it looks like the
LettersDbModel
may be incorrect...const LettersDbModel = Type.Any([Type.Literal("A"), Type.Literal("B")]); // did you mean? const LettersDbModel = Type.Union([Type.Literal("A"), Type.Literal("B")]); ??Hope this helps S
I did thanks, my code is using it correctly was just my repro was rubbish :P
CloneType
absolutely works for me 👍
from typebox.
Related Issues (20)
- esm.sh builds are broken if using FormatRegistry HOT 1
- Circular references HOT 4
- Value.Clean causes dereference error on Recursive type with nullable optional union HOT 2
- How to work with dates and timestamps HOT 2
- Issue regarding enums becoming never when using a partial deep method HOT 2
- Support for composite custom kinds HOT 1
- transform object property encoding HOT 4
- Built-in types for JSON? HOT 1
- MaxLength on keys defining a Type.Record HOT 2
- decode object with null prototype HOT 3
- Validate Enum at a low level HOT 4
- AOT compilation using custom registered types HOT 2
- Uses of BigInt over the project breaks compatibility w/ ES5 (?) HOT 3
- Typescript doesn't suggests the props using Pick or Omit HOT 1
- UUID not accpeted as string HOT 2
- How to import just Decode? HOT 4
- How to check if a schema conforms? HOT 3
- email validation doesn't work? HOT 2
- `Value.Cast` casts to wrong schema when called with union of `Refs` HOT 1
- Support for `definitions`? 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 typebox.