我目前正在使用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
答案 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.dll
和TypeLite.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();
#>