TypeLite:如何将 IEnumerable<T> 转换为 any[]

TypeLite: How to convert IEnumerable<T> to any[]

假设我有以下 C# class:

[TsClass]
public class Results<T>
{
    public IEnumerable<T> Values { get; set; }
}

我希望typelite生成如下界面:

interface IResults {
    values: any[];
}

(我将 'I' 附加到 class 名称并将 class 属性小写,并且工作正常。)

Typelite 目前正在将 IEnumerable 转换为 IT,我显然不想这样做。 I 被追加,T 是通用类型。

interface IResults {
    values: IT[];
}

我查看了以下指向 WithConverter 或 WithFormatter 的 SO 问题。 Typelite: Why is Dictionary<string, object> mapped to KeyValuePair and not to any or [index:string]:any 我还查看了 typelite 文档,但他们没有示例,所以我感到困惑。 http://type.litesolutions.net/doc

如有任何帮助,我们将不胜感激!

我确实让它工作了,但这绝对是一个 hack。有趣的是我没有早点想到它。

<#= ts.Generate(TsGeneratorOutput.Properties).Replace("IT[]", "any[]" ) #>

TypeLite 有很多扩展点,但遗憾的是文档并未涵盖所有扩展点。为此,您可以使用自己的 TsMemberTypeFormatter

.WithMemberTypeFormatter((tsProperty, memberTypeName) => {
    var asCollection = tsProperty.PropertyType as TypeLite.TsModels.TsCollection;
    var isCollection = asCollection != null;

    if(tsProperty.GenericArguments.Count == 1 && 
       tsProperty.GenericArguments[0] is TypeLite.TsModels.TsClass && 
       ((TypeLite.TsModels.TsClass)tsProperty.GenericArguments[0]).Name =="T") {
           memberTypeName = "any";
    }

    return memberTypeName + (isCollection ? string.Concat(Enumerable.Repeat("[]", asCollection.Dimension)) : "");
})