在 TypeLite 中排除间接 class 生成

Exclude indirect class generation in TypeLite

如果我的 class 使用另一个 class,TypeLite 将为另一个 class 生成一个定义,即使它没有用 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) => "")

我找不到 classes 的类似内容。

TypeLite 版本 >= 1.5.0

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


旧答案适用于版本 < 1.5.0

底层 TypeLite 基础设施支持这种行为,但不幸的是,它既没有出现在 [TsClass] 属性中,也没有出现在流畅的配置 classes 中。但是,您可以直接在 .tt 文件中使用 TsModelBuilder class。

要使其正常工作,您需要从 Poco class 中删除 [TsClass] 属性,然后在 .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);
#>