ts-json-schema-generator icon indicating copy to clipboard operation
ts-json-schema-generator copied to clipboard

feat: Support Class Mixins

Open sparebytes opened this issue 5 years ago • 1 comments

Generating the schema of a type from a mixin currently throws an error:

Variant 1

input:

function Mixin() {
    return class {};
}
export class DataBox extends Mixin() {}

error:

TypeError: Cannot read property 'flags' of undefined
  at ExpressionWithTypeArgumentsNodeParser.createType (/node_modules/ts-json-schema-hema-generator/dist/src/NodeParser/ExpressionWithTypeArgumentsNodeParser.js:15:24)
  at ChainNodeParser.createType (/node_modules/ts-json-schema-generator/dist/src/Chac/ChainNodeParser.js:27:54)
  at AnnotatedNodeParser.createType (/node_modules/ts-json-schema-generator/dist/srct/src/NodeParser/AnnotatedNodeParser.js:15:47)
  at /node_modules/ts-json-schema-generator/dist/src/NodeParser/InterfaceAndClassNodssNodeParser.js:64:72
  at Array.map (<anonymous>)
  at /node_modules/ts-json-schema-generator/dist/src/NodeParser/InterfaceAndClassNodssNodeParser.js:64:31
  at Array.reduce (<anonymous>)
  at InterfaceAndClassNodeParser.getBaseTypes (/node_modules/ts-json-schema-generatoerator/dist/src/NodeParser/InterfaceAndClassNodeParser.js:62:37)
  at InterfaceAndClassNodeParser.createType (/node_modules/ts-json-schema-generator/ator/dist/src/NodeParser/InterfaceAndClassNodeParser.js:40:53)
  at AnnotatedNodeParser.createType (/node_modules/ts-json-schema-generator/dist/srct/src/NodeParser/AnnotatedNodeParser.js:15:47)

Variant 2

input:

function Timestamped<T extends new (...args: any[]) => any>(Base: T) {
  return class _Timestamped extends Base {
    timestamp = Date.now();
  };
}
class Person {}
export const PersonTimestamped = Timestamped(Person);
export type DataBox = InstanceType<typeof PersonTimestamped>;

error:

TypeError: Cannot read property '0' of undefined
  at CallExpressionParser.createType (node_modules/ts-json-schema-generator/dist/src/NodeParser/CallExpressionParser.js:17:87)
  at ChainNodeParser.createType (node_modules/ts-json-schema-generator/dist/src/ChainNodeParser.js:27:54)
  at TypeofNodeParser.createType (node_modules/ts-json-schema-generator/dist/src/NodeParser/TypeofNodeParser.js:20:41)  
  at ChainNodeParser.createType (node_modules/ts-json-schema-generator/dist/src/ChainNodeParser.js:27:54)
  at node_modules/ts-json-schema-generator/dist/src/NodeParser/TypeReferenceNodeParser.js:38:62
  at Array.forEach (<anonymous>)
  at TypeReferenceNodeParser.createSubContext (node_modules/ts-json-schema-generator/dist/src/NodeParser/TypeReferenceNodeParser.js:37:32)
  at TypeReferenceNodeParser.createType (node_modules/ts-json-schema-generator/dist/src/NodeParser/TypeReferenceNodeParser.js:31:121)
  at ChainNodeParser.createType (node_modules/ts-json-schema-generator/dist/src/ChainNodeParser.js:27:54)
  at TypeAliasNodeParser.createType (node_modules/ts-json-schema-generator/dist/src/NodeParser/TypeAliasNodeParser.js:30:67)

sparebytes avatar Jun 20 '19 18:06 sparebytes

I also ran into this while trying to use the class remapping tools from NestJS: https://docs.nestjs.com/techniques/validation#mapped-types It would be really powerful to be able to generate correct schemas from validators of this kind.

ajwootto avatar Oct 29 '21 17:10 ajwootto