public string Generate() { StringBuilder sb = new StringBuilder(); sb.Append($"export interface {ClassName.ToTsInterfaceName()} "); sb.Append(GenerateBaseExtensionsCode()); sb.AppendLine(" {"); foreach (PropertyDeclarationSyntax prop in PropertyDeclarationSyntaxes) { if (prop.Modifiers.Any(s => s.IsKind(SyntaxKind.PrivateKeyword))) { continue; } sb.Append($" {prop.Identifier.Text.ToJsonPropName()}: "); string tsTypeEquivalent = null; switch (prop.Type) { case PredefinedTypeSyntax predefinedTypeSyntax: tsTypeEquivalent = GetEquivalentTsType(predefinedTypeSyntax); break; case IdentifierNameSyntax identifierNameSyntax: tsTypeEquivalent = GetEquivalentTsType(identifierNameSyntax); break; case GenericNameSyntax genericNameSyntax: tsTypeEquivalent = GetEquivalentTsType(genericNameSyntax); break; case NullableTypeSyntax nullableTypeSyntax: tsTypeEquivalent = GetEquivalentTsType(nullableTypeSyntax); break; case ArrayTypeSyntax arrayTypeSyntax: tsTypeEquivalent = GetEquivalentTsType(arrayTypeSyntax); break; case QualifiedNameSyntax qualifiedNameSyntax: case SimpleNameSyntax simpleNameSyntax: case NameSyntax nameSyntax: default: throw new NotImplementedException($"{prop.Type} is not yet supported."); } sb.AppendLine($"{tsTypeEquivalent};"); } sb.AppendLine("}"); return(sb.ToString()); }