in lib/declaration.ts [1052:1109]
private emitMembersAsExtensions(
classDecl: ts.ObjectTypeDeclaration, visitClassName: () => void,
visitNameOfExtensions: () => void, methods: ts.SignatureDeclaration[]) {
this.visitPromises = true;
this.fc.emitPromisesAsFutures = false;
// Emit private class containing external methods
this.maybeEmitJsAnnotation(classDecl, {suppressUnneededPaths: false});
this.emit(`abstract class _`);
visitClassName();
this.emit('{');
const mergedMembers = this.visitMergingOverloads(ts.createNodeArray(Array.from(methods)));
this.emit('}\n');
this.fc.emitPromisesAsFutures = true;
// Emit extensions on public class to expose methods
this.emit('extension');
visitNameOfExtensions();
this.emit('on');
visitClassName();
this.emit('{');
for (const merged of mergedMembers) {
const declaration = merged.mergedDeclaration;
if (ts.isPropertyDeclaration(declaration) || ts.isPropertySignature(declaration)) {
this.emitProperty({
mode: emitPropertyMode.getter,
declaration,
emitJsAnnotation: false,
isExternal: false,
emitBody: () => {
this.emitCastThisToPrivateClass(visitClassName);
this.emitExtensionGetterBody(declaration);
}
});
if (!base.isReadonly(declaration)) {
this.emitProperty({
mode: emitPropertyMode.setter,
declaration,
emitJsAnnotation: false,
isExternal: false,
emitBody: () => {
this.emitCastThisToPrivateClass(visitClassName);
this.emitExtensionSetterBody(declaration);
}
});
}
} else if (ts.isMethodDeclaration(declaration) || ts.isMethodSignature(declaration)) {
this.visit(declaration.type);
this.visitName(declaration.name);
this.visitParameters(declaration.parameters, {namesOnly: false});
this.emit('{');
this.emitCastThisToPrivateClass(visitClassName);
this.emitExtensionMethodBody(merged);
this.emit('}\n');
}
}
this.emit('}\n');
this.visitPromises = false;
}