排除TypeLite中的间接类生成

时间:2015-10-07 19:54:50

标签: typescript typelite

如果我的类使用另一个类,TypeLite将为该另一个类生成一个定义,即使它没有标记为TsClass(或通过.For包含)。 如果我有:

[TsClass]
public class Poco {
    public Guid Id { get; set;}
}

TypeLite将生成以下内容:

interface Poco {
    Id: Guid;
}
interface Guid {
}

我想指示TypeLite省略Guid的接口 - 我已经在别处定义了它,并且使用<reference path=在该生成的文件中引用它。我能够使用以下技巧(有条件地)阻止TypeLite生成模块包装器:

.WithModuleNameFormatter(( moduleName) => "")

我找不到任何类似的东西。

1 个答案:

答案 0 :(得分:1)

TypeLite版本&gt; = 1.5.0

从版本1.5.0开始,您可以在类上放置[TsIgnore]属性。类的定义不会在输出文件中生成,但如果属性引用了忽略的类,则会保留属性的类型。

OLD ANSWER对版本有效&lt; 1.5.0

底层的TypeLite基础架构支持这种行为,但不幸的是它既不会在[TsClass]属性也不会在fluent配置类中出现。但是,您可以直接在.tt文件中使用TsModelBuilder类。

要使其正常工作,您需要从[TsClass]类中删除Poco属性,并在.tt文件中手动将其添加到模型中。然后添加一个自定义MemberTypeFormatter,它会覆盖特定类型属性的输出。

<# 
    var ts = TypeScript
        .Definitions()
        .WithReference("Enums.ts")
        .ForLoadedAssemblies();
        .WithMemberTypeFormatter((TsProperty tsProperty, string memberTypeName) => {
            var externalDefinitions = new string[] { "Poco" };
            var propertyInfo = tsProperty.MemberInfo as System.Reflection.PropertyInfo;
            if (propertyInfo != null && externalDefinitions.Contains(propertyInfo.PropertyType.Name)) {
                return propertyInfo.PropertyType.Name;
            }

            var asCollection = tsProperty.PropertyType as TsCollection;
            var isCollection = asCollection != null;

            return memberTypeName + (isCollection ? string.Concat(Enumerable.Repeat("[]", asCollection.Dimension)) : "");
        });
    ts.ModelBuilder.Add<Poco>(false);
#>