Commit d4066de2 authored by nanahira's avatar nanahira

better typing

parent 723de64c
import { import {
ClassType,
SchemaClassOptions, SchemaClassOptions,
SchemaOptions, SchemaOptions,
SchemaOptionsDict, SchemaOptionsDict,
...@@ -93,15 +94,13 @@ function schemaOptionsFromClass<C extends { new (...args: any[]): any }>( ...@@ -93,15 +94,13 @@ function schemaOptionsFromClass<C extends { new (...args: any[]): any }>(
return result; return result;
} }
export function schemaFromClass<C extends { new (...args: any[]): any }>( export function schemaFromClass<T>(cl: ClassType<T>): Schema<T> {
cl: C,
): Schema<TypeFromClass<C>> {
let schema: Schema; let schema: Schema;
const optionsDict = schemaOptionsFromClass(cl); const optionsDict = schemaOptionsFromClass(cl);
if (!optionsDict) { if (!optionsDict) {
schema = Schema.object({}, true); schema = Schema.object({}, true);
} else { } else {
schema = schemasFromDict<TypeFromClass<C>>(optionsDict); schema = schemasFromDict<T>(optionsDict);
} }
const classOptions = reflector.get('SchemaClassOptions', cl); const classOptions = reflector.get('SchemaClassOptions', cl);
if (classOptions) { if (classOptions) {
...@@ -124,9 +123,9 @@ const schemaFields: (keyof Schema.Base)[] = [ ...@@ -124,9 +123,9 @@ const schemaFields: (keyof Schema.Base)[] = [
'meta', 'meta',
]; ];
function applySchemaForClass<C extends { new (...args: any[]): any }>( function applySchemaForClass<T>(
originalClass: C, originalClass: ClassType<T>,
instance: TypeFromClass<C>, instance: T,
originalObject: any, originalObject: any,
) { ) {
const schema = schemaFromClass(originalClass); const schema = schemaFromClass(originalClass);
...@@ -149,14 +148,14 @@ function applySchemaForClass<C extends { new (...args: any[]): any }>( ...@@ -149,14 +148,14 @@ function applySchemaForClass<C extends { new (...args: any[]): any }>(
} }
export function RegisterSchema(options: SchemaClassOptions = {}) { export function RegisterSchema(options: SchemaClassOptions = {}) {
return function <C extends { new (...args: any[]): any }>(originalClass: C) { return function <T>(originalClass: ClassType<T>) {
Metadata.set('SchemaClassOptions', options)(originalClass); Metadata.set('SchemaClassOptions', options)(originalClass);
const schema = schemaFromClass(originalClass); const schema = schemaFromClass(originalClass);
const newClass = (function (...args: any[]): any { const newClass = (function (...args: any[]): any {
const instance = new originalClass(...args); const instance = new originalClass(...args);
const originalObject = args[0]; const originalObject = args[0];
return applySchemaForClass(originalClass, instance, originalObject); return applySchemaForClass(originalClass, instance, originalObject);
} as unknown) as C & Schema<TypeFromClass<C>>; } as unknown) as ClassType<T> & Schema<T>;
Object.defineProperty(newClass, 'name', { Object.defineProperty(newClass, 'name', {
value: originalClass.name, value: originalClass.name,
}); });
......
import Schema from 'schemastery'; import Schema from 'schemastery';
export type ClassType<T> = { new <T>(...args: any[]): T }; export type ClassType<T> = { new <T>(...args: any[]): T };
export type TypeFromClass<C> = C extends { new (...args: any[]): infer T }
? T
: never;
export type SchemaType = export type SchemaType =
| 'string' | 'string'
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment