in src/assembler.ts [982:1035]
private _processBaseInterfaces(fqn: string, baseTypes?: ts.Type[]) {
const erasedBases = new Array<ts.Type>();
if (!baseTypes) {
return { erasedBases };
}
const result = new Array<spec.NamedTypeReference>();
const baseInterfaces = new Set<ts.Type>();
const processBaseTypes = (types: ts.Type[]) => {
for (const iface of types) {
// base is private/internal, so we continue recursively with it's own bases
if (this._isPrivateOrInternal(iface.symbol) || isInternalSymbol(iface.symbol)) {
erasedBases.push(iface);
if (!isInternalSymbol(iface.symbol)) {
const bases = iface.getBaseTypes();
if (bases) {
processBaseTypes(bases);
}
}
continue;
}
baseInterfaces.add(iface);
}
};
processBaseTypes(baseTypes);
const typeRefs = Array.from(baseInterfaces).map((iface) => {
const decl = iface.symbol.valueDeclaration;
const typeRef = this._typeReference(iface, decl, 'base interface');
return { decl, typeRef };
});
for (const { decl, typeRef } of typeRefs) {
if (!spec.isNamedTypeReference(typeRef)) {
this._diagnostics.push(JsiiDiagnostic.JSII_3005_TYPE_USED_AS_INTERFACE.create(decl, typeRef));
continue;
}
this._deferUntilTypesAvailable(fqn, [typeRef], decl, (deref) => {
if (!spec.isInterfaceType(deref)) {
this._diagnostics.push(JsiiDiagnostic.JSII_3005_TYPE_USED_AS_INTERFACE.create(decl, typeRef));
}
});
result.push(typeRef);
}
return {
interfaces: result.length === 0 ? undefined : result,
erasedBases,
};
}