in lib/declaration.ts [903:941]
private visitClassLikeHelper(
keyword: string, decl: base.ClassLike|ts.TypeLiteralNode, name: ts.Identifier,
typeParameters: ts.NodeArray<ts.TypeParameterDeclaration>,
heritageClauses: ts.NodeArray<ts.HeritageClause>) {
this.emit(keyword);
this.visitClassLikeName(name, typeParameters, heritageClauses, false);
this.emit('{');
this.maybeEmitFakeConstructors(decl);
// Synthesize explicit properties for ctor with 'property parameters'
let synthesizePropertyParam = (param: ts.ParameterDeclaration) => {
if (this.hasModifierFlag(param, ts.ModifierFlags.Public) ||
this.hasModifierFlag(param, ts.ModifierFlags.Private) ||
this.hasModifierFlag(param, ts.ModifierFlags.Protected)) {
// TODO: we should enforce the underscore prefix on privates
this.visitProperty(param, true);
}
};
(decl.members as ts.NodeArray<ts.Declaration>)
.filter(base.isConstructor)
.forEach(
(ctor) =>
(<ts.ConstructorDeclaration>ctor).parameters.forEach(synthesizePropertyParam));
this.visitClassBody(decl, name);
this.emit('}\n');
if (this.promiseMembers.length) {
const visitName = () => {
this.visitClassLikeName(name, typeParameters, ts.createNodeArray(), false);
};
const visitNameOfExtensions = () => {
this.visitClassLikeName(name, typeParameters, ts.createNodeArray(), true);
};
this.emitMembersAsExtensions(decl, visitName, visitNameOfExtensions, this.promiseMembers);
this.promiseMembers = [];
}
this.emit('\n');
}