UNPKG

ts-json-schema-generator

Version:

Generate JSON schema from your Typescript sources

42 lines (35 loc) 1.81 kB
import { Definition } from "../Schema/Definition"; import { SubTypeFormatter } from "../SubTypeFormatter"; import { BaseType } from "../Type/BaseType"; import { DefinitionType } from "../Type/DefinitionType"; import { IntersectionType } from "../Type/IntersectionType"; import { TypeFormatter } from "../TypeFormatter"; import { getAllOfDefinitionReducer } from "../Utils/allOfDefinition"; import { uniqueArray } from "../Utils/uniqueArray"; export class IntersectionTypeFormatter implements SubTypeFormatter { public constructor(private childTypeFormatter: TypeFormatter) {} public supportsType(type: IntersectionType): boolean { return type instanceof IntersectionType; } public getDefinition(type: IntersectionType): Definition { const types = type.getTypes(); // FIXME: when we have union types as children, we have to translate. // See https://github.com/vega/ts-json-schema-generator/issues/62 return types.length > 1 ? types.reduce(getAllOfDefinitionReducer(this.childTypeFormatter), { type: "object", additionalProperties: false, } as Definition) : this.childTypeFormatter.getDefinition(types[0]); } public getChildren(type: IntersectionType): BaseType[] { return uniqueArray( type.getTypes().reduce((result: BaseType[], item) => { // Remove the first child, which is the definition of the child itself because we are merging objects. // However, if the child is just a reference, we cannot remove it. const slice = item instanceof DefinitionType ? 1 : 0; return [...result, ...this.childTypeFormatter.getChildren(item).slice(slice)]; }, []) ); } }