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)
- Reduce unnecessary cloning in `Value.Convert` HOT 2
- [typebox-codegen] Option to emit types wrapped in arrow function? HOT 1
- Type.Mapped does not handle optional properties the same as Typescript HOT 2
- Add changelog or create a new release for each tag HOT 3
- TypeCheck.Decode return type inferred incorrectly? HOT 12
- Feature request: functions as defaults HOT 3
- Composite doesn't check additionalProperties HOT 2
- Custom TypeRegistry and TypeFormat HOT 1
- [feat] describe a object with pattern key, and literal key at the same time HOT 1
- Easier/general way to implement Typescript's "key remapping via `as`" approach HOT 1
- Overriding Schema Title HOT 1
- Cannot find module "./assert/index.mjs" HOT 1
- Encode is called twice on Type.Transform when inner type is Type.Intersection HOT 1
- StaticDecode cannot handle union of literals, while Static can HOT 1
- How to validate raw json schema HOT 2
- Why is Nullable not a first class Type? HOT 4
- Value.Convert does not seem to convert sometimes HOT 3
- `Value.Default` corrupts data in unions
- Is there a way to coerce when creating a schema? HOT 2
- Avoid losing precision when converting to bigints HOT 6
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.