public string Expand() { var accessModifier = (bool)_typeDeclaration.UserData["AddExportKeyword"] ? GetAccessModifier(_typeDeclaration.TypeAttributes) : string.Empty; var name = _typeDeclaration.Name; var typeType = GetTypeOfType(_typeDeclaration); var codeTypeMembers = _typeDeclaration.Members .OfType <CodeTypeMember>() .ToList(); var onlyOneConstructor = codeTypeMembers .Where(member => member is CodeConstructor) .Take(1); var members = codeTypeMembers .Where(member => IsSupportedType(member) && !(member is CodeConstructor)) .Union(onlyOneConstructor) .Select(member => { member.UserData["HasBaseConstructorCall"] = _typeDeclaration.BaseTypes.Count > 0; member.UserData["GenerateFieldType"] = !_typeDeclaration.IsEnum; member.UserData["GenerateAccessModifier"] = !_typeDeclaration.IsInterface; member.UserData["GenerateMethodBody"] = !_typeDeclaration.IsInterface; member.UserData["GeneratePropertyBody"] = !_typeDeclaration.IsInterface; return(_options.IndentString + _memberFactory.GetMember(member, _options).Expand()); }) .ToList(); var membersExpression = string.Empty; if (members.Any()) { membersExpression = string.Join(Environment.NewLine, members.Where(member => !string.IsNullOrWhiteSpace(member))); } var typeParameters = _typeDeclaration.TypeParameters.OfType <CodeTypeParameter>() .Select(parameter => _typescriptTypeParameter.Evaluate(parameter)) .ToList(); var typeParametersExpression = string.Empty; if (typeParameters.Any()) { typeParametersExpression = $"<{string.Join(",", typeParameters)}>"; } var baseTypes = _typeDeclaration.BaseTypes .OfType <CodeTypeReference>() .Where(reference => _typescriptTypeMapper.IsValidTypeForDerivation(reference)) .Select(reference => _typescriptTypeMapper.GetTypeOutput(reference)) .ToList(); var baseTypesExpression = string.Empty; if (baseTypes.Any() && !_typeDeclaration.IsEnum) { baseTypesExpression = $" extends {string.Join(",", baseTypes)}"; } return(_options.IndentString + $"{accessModifier}{typeType} {name}{typeParametersExpression}{baseTypesExpression}{{{Environment.NewLine}{membersExpression}{Environment.NewLine}{_options.IndentString}}}"); }