添加hirarchal依赖项的TypeLite生成

时间:2015-08-17 11:22:57

标签: angularjs typescript typescript1.5 typelite

我目前正在使用TypeScript中的AngularJS 1.x和C#中的AspNet WebApi后端进行客户端构建。

为了与后端进行通信,我使用了来自angular的$ resource-Service。通过使用此服务,我使用TypeLITE生成的模型接口必须扩展

ng.resource.IResource<IModel> 

是否可以从angular?

描述的此接口自动扩展所有生成的模型接口

否则所有必须像这样分开完成

export interface Model extends ng.resource.IResource<Model> {
}

非常感谢, 的MacX

2 个答案:

答案 0 :(得分:1)

这不是一项简单的任务。一个选项是创建一个自定义TsModelVisitor,它将伪类ng.resource.IResource<T>添加到代码模型中,并修改代码模型中所有其他类的基类。

我会尝试以下步骤:

  • 创建一个派生自TsModelVisitor

    的类
    • VisitModel方法中创建一个代表角度模型界面的新TsClass模型
    • VisitClass方法集BaseType中为在每个类的VisitModel方法中创建的类<​​/ li>
  • 在.tt文件中调用模型访问者

    var ts = TypeScript.Definitions()
                 .AsConstEnums(false);
    var model = ts.ModelBuilder.Build();
    model.RunVisitor(new YourModelVisitor());
    
  • 而不是<#= ts.Generate(TsGeneratorOutput.Properties) #>使用'&lt;#= ts.ScriptGenerator.Generate(model,TsGeneratorOutput.Properties)#&gt;'生成输出

答案 1 :(得分:0)

实现此目的的最简单方法是扩展TsGenerator。在与TsAngularJsModelGenerator.ttinclude文件相同的目录中创建名为TypeLite.Net4.tt的文件,并粘贴以下内容:

<#@ assembly name="$(TargetDir)\TypeLite.dll" #>
<#@ assembly name="$(TargetDir)\TypeLite.Net4.dll"#>

<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="TypeLite" #> 
<#@ import namespace="TypeLite.TsModels" #> 

<#+
class TsAngularJsModelGenerator : TsGenerator
{
    protected override void AppendClassDefinition(TsClass classModel, ScriptBuilder sb, TsGeneratorOutput generatorOutput)
    {

        string typeName = this.GetTypeName(classModel);
        string visibility = this.GetTypeVisibility(classModel, typeName) ? "export " : "";
        sb.AppendFormatIndented("{0}interface {1}", visibility, typeName);
        if (classModel.BaseType != null)
        {
            sb.AppendFormat(" extends {0}", this.GetFullyQualifiedTypeName(classModel.BaseType));
        }
        else
        {
            sb.AppendFormat("  extends ng.resource.IResource<{0}>", typeName);
        }
        sb.AppendLine(" {");
        var members = new List<TsProperty>();
        if ((generatorOutput & TsGeneratorOutput.Properties) == TsGeneratorOutput.Properties)
            members.AddRange(classModel.Properties);
        if ((generatorOutput & TsGeneratorOutput.Fields) == TsGeneratorOutput.Fields)
            members.AddRange(classModel.Fields);
        using (sb.IncreaseIndentation())
        {
            foreach (var property in members)
            {
                if (property.IsIgnored)
                    continue;
                var propTypeName = this.GetPropertyType(property);
                sb.AppendLineIndented(string.Format("{0}: {1};", this.GetPropertyName(property), propTypeName));
            }
        }
        sb.AppendLineIndented("}");
        _generatedClasses.Add(classModel);
    }
} #>

注意:您可能需要更改前两行以指向您的有效位置(我发现在MVC下bin目录并不总是包含TypeLite.dllTypeLite.Net4.dll二进制文件 - 如果您遇到问题,请记住在debug文件的第一行中将true的值设置为TypeLite.Net4.tt以获取更好的诊断)。

接下来,将TypeLite.Net4.tt文件添加到<#@include file="Manager.ttinclude"#>行下面的以下行:

<#@include file="TsAngularJsModelGenerator.ttinclude"#>

最后,在TypeLite.Net4.tt文件中更改对TypeScript.Definitions的调用,传递TsAngularJsModelGenerator的新实例,如下所示:

<# var ts = TypeScript.Definitions(new TsAngularJsModelGenerator())
    .WithReference("Enums.ts")
    .ForLoadedAssemblies();
#>