在 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);
#>
如果我的 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);
#>