diff --git a/packages/schema/src/_api/model.ts b/packages/schema/src/_api/model.ts index 764675b..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.ParserErrorOf, M, MO.ConstructorInputOf, MO.ConstructorErrorOf, MO.EncodedOf, - MO.ApiOf & MO.ApiSelfType + MO.ApiOf > export type ParserFor = Parser.Parser< @@ -45,29 +64,45 @@ export type ModelFor = M extends MO.ParsedShapeOf< ? SchemaForModel : SchemaForModel, Self> -export interface Model - extends S.Schemed, - MO.Schema< - MO.ParserInputOf, - MO.NamedE>, - M, - MO.ConstructorInputOf, - MO.NamedE>, - MO.EncodedOf, - MO.ApiOf - > { - [S.schemaField]: Self - - 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() @@ -75,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) @@ -125,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) ) 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,