diff --git a/src/NodeParser/ArrayNodeParser.ts b/src/NodeParser/ArrayNodeParser.ts index 467f635d7..bbbaf7468 100644 --- a/src/NodeParser/ArrayNodeParser.ts +++ b/src/NodeParser/ArrayNodeParser.ts @@ -1,8 +1,9 @@ import ts from "typescript"; -import { Context, NodeParser } from "../NodeParser.js"; -import { SubNodeParser } from "../SubNodeParser.js"; +import type { Context, NodeParser } from "../NodeParser.js"; +import type { SubNodeParser } from "../SubNodeParser.js"; +import { AnyType } from "../Type/AnyType.js"; import { ArrayType } from "../Type/ArrayType.js"; -import { BaseType } from "../Type/BaseType.js"; +import type { BaseType } from "../Type/BaseType.js"; export class ArrayNodeParser implements SubNodeParser { public constructor(protected childNodeParser: NodeParser) {} @@ -13,6 +14,7 @@ export class ArrayNodeParser implements SubNodeParser { public createType(node: ts.ArrayTypeNode, context: Context): BaseType { const type = this.childNodeParser.createType(node.elementType, context); - return new ArrayType(type); + // Generics without `extends` or `defaults` cannot be resolved, so we fallback to `any` + return new ArrayType(type ?? new AnyType()); } } diff --git a/test/valid-data-other.test.ts b/test/valid-data-other.test.ts index e54f499f2..08cec2cb6 100644 --- a/test/valid-data-other.test.ts +++ b/test/valid-data-other.test.ts @@ -78,6 +78,7 @@ describe("valid-data-other", () => { it("array-min-items-2", assertValidSchema("array-min-items-2", "MyType")); it("array-min-max-items", assertValidSchema("array-min-max-items", "MyType")); it("array-min-max-items-optional", assertValidSchema("array-min-max-items-optional", "MyType")); + it("array-function-generics", assertValidSchema("array-function-generics", "*")); it("array-max-items-optional", assertValidSchema("array-max-items-optional", "MyType")); it("shorthand-array", assertValidSchema("shorthand-array", "MyType")); diff --git a/test/valid-data/array-function-generics/main.ts b/test/valid-data/array-function-generics/main.ts new file mode 100644 index 000000000..9f1d80cbc --- /dev/null +++ b/test/valid-data/array-function-generics/main.ts @@ -0,0 +1,4 @@ +export function arrayGenerics(a: T[], b: T[]): T[] { + console.log(a, b); + return b; +} diff --git a/test/valid-data/array-function-generics/schema.json b/test/valid-data/array-function-generics/schema.json new file mode 100644 index 000000000..14c2ed145 --- /dev/null +++ b/test/valid-data/array-function-generics/schema.json @@ -0,0 +1,30 @@ +{ + "$ref": "#/definitions/arrayGenerics", + "$schema": "http://json-schema.org/draft-07/schema#", + "definitions": { + "arrayGenerics": { + "$comment": "(a: T[], b: T[]) => T[]", + "type": "object", + "properties": { + "namedArgs": { + "type": "object", + "properties": { + "a": { + "type": "array", + "items": {} + }, + "b": { + "type": "array", + "items": {} + } + }, + "required": [ + "a", + "b" + ], + "additionalProperties": false + } + } + } + } +}