From 0e4d45a1cea53e42f5c77a3c172581e62b4d13b0 Mon Sep 17 00:00:00 2001 From: Patrick Roza Date: Tue, 1 Feb 2022 09:24:24 +0100 Subject: [PATCH 1/3] fix (schema): Model types --- packages/schema/src/_api/model.ts | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/packages/schema/src/_api/model.ts b/packages/schema/src/_api/model.ts index 764675b..67a450b 100644 --- a/packages/schema/src/_api/model.ts +++ b/packages/schema/src/_api/model.ts @@ -10,10 +10,10 @@ import * as S from "./schemed" export type SchemaForModel = MO.Schema< MO.ParserInputOf, - MO.ParserErrorOf, + MO.NamedE>, M, MO.ConstructorInputOf, - MO.ConstructorErrorOf, + MO.NamedE>, MO.EncodedOf, MO.ApiOf & MO.ApiSelfType > @@ -47,17 +47,7 @@ export type ModelFor = M extends MO.ParsedShapeOf< export interface Model extends S.Schemed, - MO.Schema< - MO.ParserInputOf, - MO.NamedE>, - M, - MO.ConstructorInputOf, - MO.NamedE>, - MO.EncodedOf, - MO.ApiOf - > { - [S.schemaField]: Self - + SchemaForModel { readonly Parser: ParserFor> readonly Constructor: ConstructorFor> From d57f57f2cf10d40bd0db850465431fb59d6ec1a9 Mon Sep 17 00:00:00 2001 From: Patrick Roza Date: Tue, 1 Feb 2022 10:07:44 +0100 Subject: [PATCH 2/3] Fix withDefaults - Arbitrary --- packages/schema/src/_api/withDefaults.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/schema/src/_api/withDefaults.ts b/packages/schema/src/_api/withDefaults.ts index 23586cb..fd97a29 100644 --- a/packages/schema/src/_api/withDefaults.ts +++ b/packages/schema/src/_api/withDefaults.ts @@ -41,7 +41,7 @@ export interface SchemaDefaultSchema< readonly Guard: Guard.Guard - readonly Arbitrary: Arbitrary.Arbitrary + readonly Arbitrary: Arbitrary.Gen readonly annotate: ( identifier: Annotation, From 0cab0b2c7f2885b8cdd62b07ee24f091dc61eabf Mon Sep 17 00:00:00 2001 From: Patrick Roza Date: Tue, 1 Feb 2022 10:26:47 +0100 Subject: [PATCH 3/3] Fix inference --- packages/schema/src/_api/model.ts | 111 ++++++++++++++++++++++++------ 1 file changed, 91 insertions(+), 20 deletions(-) diff --git a/packages/schema/src/_api/model.ts b/packages/schema/src/_api/model.ts index 67a450b..b6c002d 100644 --- a/packages/schema/src/_api/model.ts +++ b/packages/schema/src/_api/model.ts @@ -7,15 +7,34 @@ import * as Encoder from "../Encoder" import * as Guard from "../Guard" import * as Parser from "../Parser" import * as S from "./schemed" - -export type SchemaForModel = MO.Schema< +import type { SchemaDefaultSchema } from "./withDefaults" + +interface SchemaModel< + ParserInput, + ParserError extends MO.AnyError, + ParsedShape, + ConstructorInput, + ConstructorError extends MO.AnyError, + Encoded, + Api +> extends SchemaDefaultSchema< + ParserInput, + MO.NamedE, + ParsedShape, + ConstructorInput, + MO.NamedE, + Encoded, + Api & MO.ApiSelfType + > {} + +export type SchemaForModel = SchemaModel< MO.ParserInputOf, - MO.NamedE>, + MO.ParserErrorOf, M, MO.ConstructorInputOf, - MO.NamedE>, + MO.ConstructorErrorOf, MO.EncodedOf, - MO.ApiOf & MO.ApiSelfType + MO.ApiOf > export type ParserFor = Parser.Parser< @@ -45,19 +64,45 @@ export type ModelFor = M extends MO.ParsedShapeOf< ? SchemaForModel : SchemaForModel, Self> -export interface Model - extends S.Schemed, - SchemaForModel { - readonly Parser: ParserFor> - - readonly Constructor: ConstructorFor> - - readonly Encoder: EncoderFor> - - readonly Guard: GuardFor> - - readonly Arbitrary: ArbitraryFor> -} +export interface ModelInfer + extends Model< + MO.ParserInputOf, + MO.ParserErrorOf, + M, + MO.ConstructorInputOf, + MO.ConstructorErrorOf, + MO.EncodedOf, + MO.ApiOf + > {} + +export interface Model< + ParserInput, + ParserError extends MO.AnyError, + ParsedShape, + ConstructorInput, + ConstructorError extends MO.AnyError, + Encoded, + Api +> extends S.Schemed< + SchemaModel< + ParserInput, + ParserError, + ParsedShape, + ConstructorInput, + ConstructorError, + Encoded, + Api + > + >, + SchemaModel< + ParserInput, + ParserError, + ParsedShape, + ConstructorInput, + ConstructorError, + Encoded, + Api + > {} export const NameSym = Symbol() @@ -65,7 +110,33 @@ export const NameSym = Symbol() * @inject genericName */ export function Model(__name?: string) { - return (self: Self): Model => { + return < + ParserInput, + ParserError extends MO.AnyError, + ParsedShape, + ConstructorInput, + ConstructorError extends MO.AnyError, + Encoded, + Api + >( + self: MO.Schema< + ParserInput, + ParserError, + ParsedShape, + ConstructorInput, + ConstructorError, + Encoded, + Api + > + ): Model< + ParserInput, + ParserError, + ParsedShape, + ConstructorInput, + ConstructorError, + Encoded, + Api + > => { const schemed = S.Schemed(named(__name ?? "Model(Anonymous)")(self)) const schema = S.schema(schemed) @@ -115,7 +186,7 @@ export function Model(__name?: string) { } } -export function stable(constructor: Model) { +export function stable(constructor: ModelInfer) { const schema = named(constructor[NameSym] ?? "Model(Anonymous)")( S.schema(constructor) )