diff --git a/factory/parser.ts b/factory/parser.ts index c1205c22f..212820f6f 100644 --- a/factory/parser.ts +++ b/factory/parser.ts @@ -16,6 +16,7 @@ import { BooleanLiteralNodeParser } from "../src/NodeParser/BooleanLiteralNodePa import { BooleanTypeNodeParser } from "../src/NodeParser/BooleanTypeNodeParser"; import { CallExpressionParser } from "../src/NodeParser/CallExpressionParser"; import { ConditionalTypeNodeParser } from "../src/NodeParser/ConditionalTypeNodeParser"; +import { ConstructorNodeParser } from "../src/NodeParser/ConstructorNodeParser"; import { EnumNodeParser } from "../src/NodeParser/EnumNodeParser"; import { ExpressionWithTypeArgumentsNodeParser } from "../src/NodeParser/ExpressionWithTypeArgumentsNodeParser"; import { FunctionNodeParser } from "../src/NodeParser/FunctionNodeParser"; @@ -112,6 +113,7 @@ export function createParser(program: ts.Program, config: Config, augmentor?: Pa .addNodeParser(new BooleanLiteralNodeParser()) .addNodeParser(new NullLiteralNodeParser()) .addNodeParser(new FunctionNodeParser()) + .addNodeParser(new ConstructorNodeParser()) .addNodeParser(new ObjectLiteralExpressionNodeParser(chainNodeParser)) .addNodeParser(new ArrayLiteralExpressionNodeParser(chainNodeParser)) diff --git a/src/NodeParser/ConstructorNodeParser.ts b/src/NodeParser/ConstructorNodeParser.ts new file mode 100644 index 000000000..5f3a24885 --- /dev/null +++ b/src/NodeParser/ConstructorNodeParser.ts @@ -0,0 +1,18 @@ +import ts from "typescript"; +import { SubNodeParser } from "../SubNodeParser"; +import { BaseType } from "../Type/BaseType"; +import { ConstructorType } from "../Type/ConstructorType"; + +/** + * A constructor node parser that creates a constructor type so that mapped + * types can use constructors as values. There is no formatter for constructor + * types. + */ +export class ConstructorNodeParser implements SubNodeParser { + public supportsNode(node: ts.ConstructorTypeNode): boolean { + return node.kind === ts.SyntaxKind.ConstructorType; + } + public createType(): BaseType { + return new ConstructorType(); + } +} diff --git a/src/Type/ConstructorType.ts b/src/Type/ConstructorType.ts new file mode 100644 index 000000000..c709055d3 --- /dev/null +++ b/src/Type/ConstructorType.ts @@ -0,0 +1,7 @@ +import { BaseType } from "./BaseType"; + +export class ConstructorType extends BaseType { + public getId(): string { + return "constructor"; + } +} diff --git a/test/valid-data-type.test.ts b/test/valid-data-type.test.ts index 3c71b8fa2..44c969374 100644 --- a/test/valid-data-type.test.ts +++ b/test/valid-data-type.test.ts @@ -1,3 +1,4 @@ +import { ConstructorType } from "../src/Type/ConstructorType"; import { FunctionType } from "../src/Type/FunctionType"; import { assertMissingFormatterFor, assertValidSchema } from "./utils"; @@ -127,6 +128,8 @@ describe("valid-data-type", () => { it("type-conditional-infer-tail-recursion", assertValidSchema("type-conditional-infer-tail-recursion", "MyType")); it("type-conditional-infer-tuple-xor", assertValidSchema("type-conditional-infer-tuple-xor", "MyType")); + it("type-constructor", assertMissingFormatterFor(new ConstructorType(), "type-constructor", "MyType")); + it("type-tuple-nested-rest", assertValidSchema("type-tuple-nested-rest", "MyType")); it("type-tuple-nested-rest-to-union", assertValidSchema("type-tuple-nested-rest-to-union", "MyType")); it("type-tuple-nested-rest-uniform", assertValidSchema("type-tuple-nested-rest-uniform", "MyType")); diff --git a/test/valid-data/type-constructor/main.ts b/test/valid-data/type-constructor/main.ts new file mode 100644 index 000000000..93d5a58dc --- /dev/null +++ b/test/valid-data/type-constructor/main.ts @@ -0,0 +1,5 @@ +type MyConstructor = new () => any; + +export type MyType = { + a: MyConstructor; +};