Comments (5)
@gcanti what's your thought about this? we mentioned a few times the possibility of adding a generic to Schema
to represent the type from construction, this can be useful in many other cases such as for example branded types & refinements, being able to have a validating constructor kind of completes the idea of defining types (data models) through schema.
In the very old schema I had one and I have to say it was working kind of fine, given that we are stuffing Schema with params for context it might be the time to evaluate as a more general solution to this specific issue
from effect.
@mikearnaldi Schema classes already carry a constructor generic which is controlled by the property descriptors of the struct schema;
effect/packages/schema/src/Schema.ts
Line 4545 in 10bcbc6
for struct schemas you can also have a createConstructor combinator or so.
As to validating constructors for branded types & refinements; you already carry the From
and To
, that is exactly the type of constructor I generally need:
export const addConstructor = <Self extends S.Schema<never, any, any>>(s: Self) => {
return Object.assign(S.decodeSync(s) as SchemaConstructor<Self>, s)
}
export type SchemaConstructor<Self extends S.Schema<any, any>> = (
i: S.Schema.From<Self>,
options?: AST.ParseOptions
) => S.Schema.To<Self>
So I would personally not bother with an I
on schemas.
from effect.
@patroza another alternative to consider:
Option 1:
class Person extends Schema.Class<Person>()({
name: Schema.string,
createdAt: Schema.Date,
posts: Schema.array(Schema.string),
}) {
constructor(data: { name: Person["name"] }) {
super({ ...data, createdAt: new Date(), posts: [] });
}
}
const person = new Person({
name: "Stefan",
});
Option 2:
class Person extends Schema.Class<Person>()({
name: Schema.string,
createdAt: Schema.Date,
posts: Schema.array(Schema.string),
}) {
static make(data: { name: Person["name"] }) {
return new Person({
...data,
createdAt: new Date(), //default value
posts: [], //default value
});
}
}
const person = Person.make({
name: "Stefan",
});
from effect.
@steffanek option 1 breaks the constructor which is used by schema implementation on decode, Arbitrary creation etc, it will always create new date and posts array.
option 2 doesnโt break it but prevents you from supply alternative values. Then agai, it is also nice to have two constructors; the class constructor used for schema purposes and the make constructor for brand new instances.
My suggestions however tick both boxes; you can new up with defaults, or to restore or for copy and change.
from effect.
linked (in top post) naive implementation code updated with some fixes
from effect.
Related Issues (20)
- When using SchemaTaggedError with Match, I got an Effect.Effect<unknow, unknown, unknown> HOT 3
- JSONSchema not working as expected with `S.optional` HOT 4
- From Discord: Bug with Rpc API: Suppressed Transport Level Errors HOT 1
- CLI: Transform JS object of CLI options to a string HOT 1
- Schema: Create API to add annotations to Class schemas
- From Discord: Exploring the possibility of making `partial` behave like `optional` with exactness
- Schedule forked types were not flipped in 2.3 HOT 1
- From Discord: Proposed Change to Schedule Class Parameters
- @effect/schema: does `onExcessProperty` affect encoding as well as decoding? HOT 1
- From Discord: Modification of ReadonlyArray.groupBy Signature
- The name doesn't work HOT 1
- TaggedError does not construct properly HOT 5
- Picking literals in Schema HOT 9
- Expose `ConfigError` not as a Union but wrapped as Class HOT 1
- Migration from fp-ts: replacements for fp-ts-routing and hyper-ts HOT 10
- Platform: Missing File.writeString, File.readString
- Platform/FileSystem: Add a default file system Logger instance HOT 1
- Use span attributes to enrich stack traces HOT 1
- Schema.omit merges discriminated union values HOT 3
- Class APIs: overriding a field is allowed but looks unsafe 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 effect.