TSTypeFile Generate(IActivityMonitor monitor, TypeScriptGenerator g, Type i)
            {
                var f    = g.GetTSTypeFile(monitor, i);
                var file = f.EnsureFile();

                file.Body.Append("export interface ").Append(f.TypeName);
                bool hasInterface = false;

                foreach (Type b in i.GetInterfaces())
                {
                    if (!hasInterface)
                    {
                        file.Body.Append(" extends ");
                        hasInterface = true;
                    }
                    else
                    {
                        file.Body.Append(", ");
                    }
                    AppendTypeName(file.Body, monitor, g, b);
                }
                file.Body.OpenBlock();
                foreach (var p in i.GetProperties())
                {
                    file.Body.Append(g.ToIdentifier(p.Name)).Append(": ");
                    AppendTypeName(file.Body, monitor, g, p.PropertyType);
                    file.Body.Append(";").NewLine();
                }
                file.Body.CloseBlock();
                return(f);
            }
 void AppendTypeName(ITSFileBodySection body, IActivityMonitor monitor, TypeScriptGenerator g, Type t)
 {
     if (t == typeof(int) || t == typeof(float) || t == typeof(double))
     {
         body.Append("number");
     }
     else if (t == typeof(bool))
     {
         body.Append("boolean");
     }
     else if (t == typeof(string))
     {
         body.Append("string");
     }
     else if (t == typeof(object))
     {
         body.Append("unknown");
     }
     else
     {
         var other = g.GetTSTypeFile(monitor, t);
         body.File.Imports.EnsureImport(other.TypeName, other.EnsureFile());
         body.Append(other.TypeName);
     }
 }
            public bool GenerateCode(IActivityMonitor monitor, TypeScriptGenerator g)
            {
                Generate(monitor, g, typeof(ICommandOne));
                Generate(monitor, g, typeof(ICommandTwo));
                Generate(monitor, g, typeof(ICommandThree));

                // Skip "object CommandModel" property for ICommand.
                var f = g.GetTSTypeFile(monitor, typeof(ICommand));

                f.EnsureFile().Body.Append("export interface ").Append(f.TypeName).OpenBlock().CloseBlock();

                return(true);
            }