diff --git a/CHANGELOG.md b/CHANGELOG.md index 5bffc3eff..ee516050e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ ### Bug Fixes +- Fixed crash when converting abstract mixin class, #2011. - Readme files within monorepos now have `@link` tags resolved, #2029. - Correctly resolve unqualified links to class members within parameters, #2031. - TypeDoc will now consider other reflections with the same name as parents when resolving links, #2033. diff --git a/src/lib/converter/types.ts b/src/lib/converter/types.ts index 927f3e152..b889deb16 100644 --- a/src/lib/converter/types.ts +++ b/src/lib/converter/types.ts @@ -153,8 +153,16 @@ export function convertType( seenTypeSymbols.add(symbol); } - const converter = converters.get(node.kind); + let converter = converters.get(node.kind); if (converter) { + // Hacky fix for #2011, need to find a better way to choose the converter. + if ( + converter === intersectionConverter && + !typeOrNode.isIntersection() + ) { + converter = typeLiteralConverter; + } + const result = converter.convertType(context, typeOrNode, node); if (symbol) seenTypeSymbols.delete(symbol); return result; diff --git a/src/test/converter2/issues/gh2011.ts b/src/test/converter2/issues/gh2011.ts new file mode 100644 index 000000000..18eaca2f6 --- /dev/null +++ b/src/test/converter2/issues/gh2011.ts @@ -0,0 +1,8 @@ +export class Component {} + +type Constructor> = new (...args: any[]) => T; + +export function Readable>(Base: TBase) { + abstract class Reader extends Base {} + return Reader; +} diff --git a/src/test/issueTests.ts b/src/test/issueTests.ts index d17042bb9..e14676789 100644 --- a/src/test/issueTests.ts +++ b/src/test/issueTests.ts @@ -1,4 +1,8 @@ -import { deepStrictEqual as equal, ok } from "assert"; +import { + deepStrictEqual as equal, + notDeepStrictEqual as notEqual, + ok, +} from "assert"; import type { Application } from "../lib/application"; import { DeclarationReflection, @@ -671,6 +675,14 @@ export const issueTests: { equal(Comment.combineDisplayParts(fn.comment?.summary), "Docs"); }, + gh2011(project) { + const readable = query(project, "Readable").signatures![0]; + const type = readable.type!; + equal(type.type, "intersection" as const); + notEqual(type.types[0], "intersection"); + notEqual(type.types[1], "intersection"); + }, + gh2012(project) { project.hasOwnDocument = true; const model = query(project, "model");